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

