You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中具体类能否像接口一样定义空方法签名将实现委托给子类?

问题解答

首先明确结论:取决于你是否允许调整FooBase的类类型,两种情况对应不同实现方案:

  • 若要求FooBase必须保持为可直接实例化的具体类:
    C#语法不支持普通具体类中定义只有方法签名、无实现的成员,你可以通过定义带空默认实现的虚方法,实现类似效果,子类可自主选择是否重写方法逻辑:
    public class FooBase
    {
        // 虚方法提供空默认实现
        public virtual void DoBar()
        {
            // 空实现,也可抛出异常提醒子类必须重写
            // throw new NotImplementedException("请在子类中重写DoBar方法");
        }
    }
    
    public class FooChild : FooBase
    {
        // 可选重写方法
        public override void DoBar()
        {
            // 子类具体实现逻辑
        }
    }
    
    注意:该方案无法像接口一样强制子类必须实现方法,仅靠约定约束,适合允许子类不重写的场景
  • 若可以接受将FooBase调整为不可直接实例化的抽象类:
    可以通过抽象方法实现和接口完全一致的效果,只有方法签名、无实现,且强制所有非抽象子类必须重写实现:
    // 类修饰符改为abstract,成为抽象类,不可直接new实例化
    public abstract class FooBase
    {
        // 抽象方法仅定义签名,无实现
        public abstract void DoBar();
    }
    
    public class FooChild : FooBase
    {
        // 必须override实现抽象方法,否则编译报错
        public override void DoBar()
        {
            // 子类具体实现逻辑
        }
    }
    

如果你需要和接口完全一致的「强制子类必须实现方法」的约束,优先选择第二种方案即可。

内容的提问来源于stack exchange,提问作者Mike D3ViD Tyson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:54:04