C#中接口默认实现标记为virtual的含义?为何无法按类方式重写?
接口中带默认实现的virtual方法的含义及调用问题
为什么你的代码编译失败
你写的base.M()无法通过编译,核心原因是接口不属于类的继承链。base关键字仅用于访问类的直接基类成员,而接口的默认实现并不属于实现类的基类成员范畴,因此编译器无法识别base.M()的指向。
接口中标记virtual的真正含义
在C# 8.0及后续版本中,接口支持定义带默认实现的方法,标记virtual的作用主要体现在两个场景:
- 接口间的继承重写:允许子接口通过
override关键字重写父接口的默认实现。示例:
interface IBase { public virtual void M() => Console.WriteLine("IBase的默认实现"); } interface IDerived : IBase { public override void M() => Console.WriteLine("IDerived重写后的实现"); }
当类实现IDerived但未自行实现M时,会自动使用IDerived的重写版本,而非IBase的默认实现。
- 实现类方法的虚拟化:如果实现类在实现接口方法时使用
override关键字,该方法会成为类的虚拟方法,允许子类进一步重写。示例:
class A : I { // 用override实现接口方法,此时A.M为虚拟方法 public override void M() { // 调用接口默认实现的正确方式 ((I)this).M(); Console.WriteLine("A类自定义逻辑"); } } class B : A { // 可以继续重写A中的M方法 public override void M() { base.M(); // 此处base指向类A,合法有效 Console.WriteLine("B类自定义逻辑"); } }
若实现类未使用override,直接实现M(),则该方法是密封状态(非虚拟),子类无法重写。
调用接口默认实现的正确方式
要在实现类中调用接口的默认实现,需将this强制转换为对应接口类型后调用:
class A : I { public void M() { // 调用I接口的默认实现 ((I)this).M(); // 自定义业务逻辑 Console.WriteLine("执行自定义逻辑"); } }
内容的提问来源于stack exchange,提问作者baddie
相关产品推荐
相关产品推荐

