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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:00:17