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

为何实现接口的类中丢失了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:01:13