同一方法名不同返回值:能否用单一实现兼顾抽象类与接口?
问题解答
由于C#中方法的签名仅包含方法名称和参数列表,返回类型不属于签名的一部分,因此BaseAbstract的Clone()(返回BaseAbstract)和ICloneable的Clone()(返回object)属于同名同参数但返回值不同的方法,无法通过单个方法签名同时满足抽象类的重写要求和接口的实现要求。
不过你可以让核心克隆逻辑只实现一次,通过显式接口实现转发调用重写的抽象类方法,就像你当前的写法一样——这已经是最优解,没有重复的克隆逻辑:
public abstract class BaseAbstract { public abstract BaseAbstract Clone(); } public interface ICloneable { object Clone(); } public class Derived : BaseAbstract, ICloneable { public override BaseAbstract Clone() { // 核心克隆逻辑只在这里实现一次 return new Derived() { // 克隆属性或其他逻辑 }; } // 显式接口实现仅转发调用,无额外逻辑 object ICloneable.Clone() => this.Clone(); }
这种写法既满足了抽象类的重写要求,又实现了接口,同时保证克隆逻辑只维护一处,避免了代码冗余。
内容的提问来源于stack exchange,提问作者Sarath S Menon
相关产品推荐
相关产品推荐

