亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何防止 C# 中的非法 ICloneable<T> 繼承?

如何防止 C# 中的非法 ICloneable<T> 繼承?

C#
狐的傳說 2021-06-24 18:02:33
我有一個界面: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的類型,如果不是則拋出異常,這可能會讓人感覺像是編譯時錯誤,如果它在運行時完成得足夠早。



查看完整回答
反對 回復 2021-06-27
  • 1 回答
  • 0 關注
  • 202 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號