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

如何精简仅P属性返回值不同的接口I实现类的冗余代码?

解决多类实现接口的代码冗余问题

针对你需要实现多个仅P属性返回值不同的I接口实现类的场景,有以下几种简洁方案:

方案1:抽象基类提取公共逻辑

创建一个抽象基类实现I接口的公共方法,将P属性留作抽象,子类仅需实现该属性即可,避免重复编写f()等公共代码。

// 抽象基类,封装I接口的公共实现
public abstract class BaseI : I
{
    // 公共方法f()的实现,所有子类复用
    public void f()
    {
        // 这里编写原B类中f()的通用逻辑
    }

    // 抽象属性,由子类提供具体返回值
    public abstract A P { get; }

    // I接口的其他方法也可在此统一实现
}

// 子类仅需实现P属性
public class B : BaseI
{
    private static readonly A _staticP = new A("signature");
    public override A P => _staticP;
}

// 另一个子类,仅修改签名即可
public class C : BaseI
{
    private static readonly A _staticP = new A("another-signature");
    public override A P => _staticP;
}

方案2:泛基类+特性标记(极致简化)

如果每个子类的签名固定且与类型绑定,可结合特性和泛型基类,让子类仅需添加特性标记即可完成实现:

首先定义存储签名的特性:

[AttributeUsage(AttributeTargets.Class)]
public class SignatureAttribute : Attribute
{
    public string Value { get; }
    public SignatureAttribute(string value) => Value = value;
}

然后实现泛型基类:

public class GenericBaseI<T> : I where T : class
{
    private static readonly A _staticP;

    static GenericBaseI()
    {
        var signatureAttr = typeof(T).GetCustomAttribute<SignatureAttribute>();
        if (signatureAttr == null)
            throw new InvalidOperationException($"类{typeof(T)}必须标记SignatureAttribute");
        _staticP = new A(signatureAttr.Value);
    }

    public A P => _staticP;

    public void f()
    {
        // 通用的f()逻辑
    }
}

子类实现变得极度简洁:

[Signature("signature")]
public class B : GenericBaseI<B>
{
    // 无需额外代码,除非要重写公共方法
}

[Signature("another-signature")]
public class C : GenericBaseI<C>
{
}

方案3:委托注入(动态场景适用)

若需要动态指定P的返回值,可通过委托注入的方式实现基类,灵活适配不同签名:

public class DelegateBaseI : I
{
    private readonly Func<A> _pProvider;

    public DelegateBaseI(Func<A> pProvider)
    {
        _pProvider = pProvider ?? throw new ArgumentNullException(nameof(pProvider));
    }

    public A P => _pProvider();

    public void f()
    {
        // 通用的f()逻辑
    }
}

使用时直接传入签名对应的A实例创建逻辑:

var b = new DelegateBaseI(() => new A("signature"));
var c = new DelegateBaseI(() => new A("another-signature"));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:45:36