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
相关产品推荐
相关产品推荐

