如何为抽象基类的抽象方法实现显式继承?
在C#中模拟抽象类的“显式实现”效果
在C#中,接口支持显式实现——这类方法仅能通过对应接口类型访问,派生类还可以定义同名同参但返回值不同的方法。但对于包含字段、无法改为接口的抽象类,直接尝试覆盖抽象方法后定义同名方法会触发编译错误,因为C#不允许仅靠返回值差异来重载方法。以下是两种可行的解决方案:
方案一:使用new关键字隐藏基类方法
通过new关键字标记派生类的同名方法,明确告知编译器这是隐藏基类方法而非重载,既能绕过返回值不同的编译限制,也能实现类似接口显式实现的效果:
代码示例
抽象类定义:
public abstract class Foo { public abstract void DoSomething(); }
派生类的正确实现:
public class Bar : Foo { // 实现抽象类的抽象方法,仅能通过Foo基类类型访问 public override void DoSomething() => throw new NotImplementedException("Ha ha! Tricked you! I don't do anything!"); // 用new关键字隐藏基类方法,通过Bar派生类类型访问时会调用此版本 public new int DoSomething() => throw new Exception("I tricked you again! I do do something! I throw exceptions!"); }
效果验证
Foo foo = new Bar(); foo.DoSomething(); // 调用override的void版本,抛出NotImplementedException Bar bar = new Bar(); bar.DoSomething(); // 调用new的int版本,抛出Exception
方案二:抽象类实现接口,派生类显式实现接口
如果希望更贴近接口显式实现的语义,可以先定义对应接口,让抽象类实现该接口并将接口方法声明为抽象,再让派生类显式实现接口方法,同时定义自己的同名方法:
代码示例
定义接口与抽象类:
public interface IFoo { void DoSomething(); } public abstract class Foo : IFoo { // 抽象类将接口方法声明为抽象,强制派生类实现 public abstract void DoSomething(); }
派生类实现:
public class Bar : Foo, IFoo { // 显式实现接口方法,仅能通过IFoo接口类型访问 void IFoo.DoSomething() => throw new NotImplementedException("Ha ha! Tricked you! I don't do anything!"); // 派生类自定义的同名方法,通过Bar类型访问时调用此版本 public int DoSomething() => throw new Exception("I tricked you again! I do do something! I throw exceptions!"); // 实现抽象类的抽象方法,直接转发到显式接口实现 public override void DoSomething() => ((IFoo)this).DoSomething(); }
效果验证
IFoo foo = new Bar(); foo.DoSomething(); // 调用显式接口实现的版本,抛出NotImplementedException Bar bar = new Bar(); bar.DoSomething(); // 调用派生类的int版本,抛出Exception Foo baseFoo = new Bar(); baseFoo.DoSomething(); // 调用override的方法,最终转发到显式接口实现
内容的提问来源于stack exchange,提问作者Brendan Lynn
相关产品推荐
相关产品推荐

