为何实现接口的类中丢失了IBuilder泛型接口的AddAttribute方法?
问题原因与解决方案
核心原因
C# 8及以后引入的接口默认实现方法,不会被实现类自动继承。这些方法的归属是接口本身,而非实现类:
- 当你用
IEntityBuilder接口类型调用时,因为接口继承链包含了IBuilder<TSelf, TCreator>,所以可以访问接口的默认实现; - 但直接用
EntityBuilder类实例时,类不会自动将接口的默认实现方法作为自己的成员,因此无法直接调用。
这是C#的设计规则:接口默认实现的初衷是为了给已有接口新增方法时,不破坏现有实现类的兼容性,而非让类继承接口的方法实现。
解决方法
方法一:在实现类中显式实现并调用接口默认逻辑
在EntityBuilder中手动实现AddAttribute方法,内部调用接口的默认实现:
public class EntityBuilder : IEntityBuilder { public IEntityBuilder AddAttribute(string attributeName, string attributeValue) { // 调用泛型IBuilder接口的默认实现 return ((IBuilder<IEntityBuilder, IBuilder>)this).AddAttribute(attributeName, attributeValue); } // 若需要,同样处理IBuilder的Build方法 public string Build() { return ((IBuilder)this).Build(); } // 你的专属方法实现... }
方法二:在子接口中重新声明方法,强制实现类处理
在IEntityBuilder中重新声明AddAttribute方法,让实现类必须显式处理(可以自己实现或调用默认逻辑):
public interface IEntityBuilder : IBuilder<IEntityBuilder, IBuilder> { // 用new关键字重新声明,覆盖基接口的方法定义 new IEntityBuilder AddAttribute(string attributeName, string attributeValue); // 专属方法... } // 实现类中: public class EntityBuilder : IEntityBuilder { public IEntityBuilder AddAttribute(string attributeName, string attributeValue) { // 可选:自己实现逻辑,或调用基接口默认实现 return ((IBuilder<IEntityBuilder, IBuilder>)this).AddAttribute(attributeName, attributeValue); } // 其他实现... }
内容的提问来源于stack exchange,提问作者SoulB
相关产品推荐
相关产品推荐

