我有一個界面:public interface ICloneable<out T> where T : ICloneable<T>{ T Clone();}應該接收實現此接口的類型(如下所示)。我可以創建一個實現它的類:public class Class : ICloneable<Class>{ public Class Clone() { return (Class)MemberwiseClone(); }}偉大的 !但是任何人都可以創建一個實現 ICloneable<T> “錯誤”的類。是否存在防止繼承的方法,如下所示?(2個例子)public class Other : ICloneable<Class>{ public Class Clone() { return new Class(); }}public class Other : Class, ICloneable<Class>{ public Class Clone() { return (Other)MemberwiseClone(); }}并允許繼承如下所示?(任何來自 2 個例子)public class Other : ICloneable<Other>{ public Other Clone() { return (Other)MemberwiseClone(); }}public class Other : Class, ICloneable<Other>{ public Other Clone() { return (Other)MemberwiseClone(); }}
1 回答

www說
TA貢獻1775條經驗 獲得超8個贊
你不能重載一個類,所以:
public class Other : Class {}
public class Other : Class, IC<Other> {}
永遠不會工作。
現在,我要拉喬恩斯基特并告訴你如何能做到這一點,但后來從做它阻止你。你可以這樣做:
public class CloneableOther : Class, ICloneable<Other> { }
public class Other : CloneableOther
{
}
public class CloneableFoo : Class, ICloneable<Foo> { }
public class Foo : CloneableFoo
{
}
這段代碼所做的是有效地從繼承中刪除泛型參數。除了,Foo仍然可以這樣做:Foo : CloneableFoo, ICloneable<Other>,現在您必須為每個ICloneable實例創建兩個類。
這就是為什么你首先需要這個?這是一種做法Foo : IInterface<Foo>,但沒有辦法強制執行。最好的辦法是復制和粘貼,并確保課程匹配。
也許另一種方法是在 的構造函數中Class檢查 的類型是否是類ICloneable的類型,如果不是則拋出異常,這可能會讓人感覺像是編譯時錯誤,如果它在運行時完成得足夠早。
- 1 回答
- 0 關注
- 202 瀏覽
添加回答
舉報
0/150
提交
取消