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

