2009-07-15 23 views
1

我嘗試創建繼承System.ICloneable接口的通用接口,但Clone()方法的返回類型是T.當然,T型需要約束要確定它是System.Object類的繼承,但下面的代碼不起作用。C#.NET中liskov原理的類型參數約束

public interface ICloneable<T> : System.ICloneable where T : object { 

    T Clone(); 

} 

我在做什麼錯?

而且下面的約束不起作用:

  1. 其中T:System.Object的
  2. 其中T:類

我怎樣才能使用Liskov的原則在此情況下說你可以縮小你的回報類型,解決這個問題?

P.S .:對不起,我的英文,如果我犯了錯誤。我不是以英語爲母語的人。

+1

沒有必要爲你的英語找藉口,這很好。 – 2009-07-15 12:13:02

+0

順便提一下,我建議你將T類型標記爲協變(在它之前放置單詞「out」),並且還要添加一個只讀屬性「T self」,否則定義一個接口ISelf 以只讀財產「T自我」。請注意,T不應限制爲ICloneable 也不是ISelf 。如果你這樣做,可以有沒有公共克隆方法的類Foo和DerivedFoo,以及派生自這些類的CloneableFoo和CloneableDerivedFoo,並且接受Foo的任何可複製派生作爲ICloneable ,即使這樣的可克隆衍生物不共享基類。 – supercat 2011-08-08 20:33:53

回答

5

爲什麼你需要一個約束呢?一切從object繼承...

沒有約束你的代碼應該工作,但你需要實現以同樣的方式既Clone方法爲IEnumerable/IEnumerable<T>工作 - .NET沒有協變返回類型。你也應該然後指定你的Clone方法隱藏着一個在ICloneable

public interface ICloneable<T> : ICloneable 
{ 
    new T Clone(); 
} 

注意,電流ICloneable界面有些過時 - 因爲它沒有給克隆的深度的指示,這不是非常有用,最案例。

你真的需要擴展非泛型類型嗎?您是否期望用戶想要使用非通用接口以及通用接口?