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

如何在C#子类中访问或重写接口的默认方法实现?

C# 8 接口默认实现的重写与调用方案

C# 8 引入的接口默认实现有个关键设计:默认方法不会自动成为实现类的公共成员,所以直接用var s1 = new Student()时无法访问CalculateAgeOn——这是为了避免接口方法污染类的公共API。以下是满足你需求的具体方案:

1. 让类直接暴露方法并自定义实现

如果想无需转换接口类型就能调用方法,只需在Student类中显式实现该方法即可:

IPerson s1 = new Student();
int age1 = s1.CalculateAgeOn(DateTime.Today);
Console.WriteLine(age1); // 输出20

var s2 = new Student();
int age2 = s2.CalculateAgeOn(DateTime.Today);
Console.WriteLine(age2); // 同样输出20

public interface IPerson
{
    int CalculateAgeOn(DateTime date)
    {
        return 18; // 接口默认实现
    }
}

public class Student : IPerson
{
    // 类中显式实现方法,覆盖接口默认逻辑
    public int CalculateAgeOn(DateTime date)
    {
        return 20; // 自定义实现
    }
}

2. 委托调用接口的默认实现

如果想复用接口的默认实现逻辑,可通过强制转换为接口类型来调用:

public class Student : IPerson
{
    public int CalculateAgeOn(DateTime date)
    {
        // 先调用接口默认实现,再扩展自己的逻辑
        int defaultAge = ((IPerson)this).CalculateAgeOn(date);
        return defaultAge + 2; // 输出20
    }
}

关于“重写”默认实现的说明

接口中的默认方法不能直接标记为virtual,但可以通过接口定义抽象方法+默认实现的方式,让类按需重写核心逻辑:

public interface IPerson
{
    // 抽象方法,类可选择重写
    protected abstract int GetBaseAge(DateTime date);

    // 默认实现依赖抽象方法
    int CalculateAgeOn(DateTime date)
    {
        return GetBaseAge(date);
    }
}

public class Student : IPerson
{
    // 重写抽象方法,自定义核心逻辑
    protected int GetBaseAge(DateTime date)
    {
        return 18; // 复用接口默认值或自定义
    }
}

这种设计既保留了默认实现的复用性,又让类能灵活扩展,符合“默认实现”的特性定位——提供基础逻辑,同时支持类自定义行为。

内容的提问来源于stack exchange,提问作者Richard Pawson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:35:04