2012-01-07 59 views
0

通用接口明確的通用接口

interface ICloneable <T> 
{ 
    T CopyFrom (T source); 
    T CopyFrom (T source); 
    T CopyTo (T destination); 
} 

CLASS:實現通用接口:

public class Entity: ICloneable <Entity> 
{ 
    public int ID { get; set; } 
    public Entity CopyFrom (Entity source) 
    { 
    this.ID = source.ID; 
    return (this); 
    } 
} 

Windows窗體:本表只接受實現T型性格上面的通用接口。

public sealed partial class Computer <T>: System.Windows.Forms.Form 
{ 
    private T ObjectCurrent { get; set; } 
    private T ObjectOriginal { get; set; } 
    public Computer (HouseOfSynergy.Library.Interfaces.ICloneable <T> @object) 
    { 
     this.ObjectOriginal = (T) @object; 
     this.ObjectCurrent = @object.Clone(); 
    } 
    private void buttonOk_Click (object sender, System.EventArgs e) 
    { 
     ((ICloneable <T>) this.ObjectOriginal).CopyFrom(this.ObjectCurrent); 
     this.Close(); 
    } 
} 

正如您所猜測的,致電((ICloneable <T>) this.ObjectOriginal).CopyFrom(this.ObjectCurrent);是完全合法的。但是,上面的代碼不保證確保傳遞給類的T實現了ICloneable <T>。我強迫它通過構造函數,但看起來很糟糕。

以下兩種結構是非法的,我不知道爲什麼:

class Computer < ICloneable <T>>: System.Windows.Forms.Form 

OR

class Computer < T where T: ICloneable <T> >: System.Windows.Forms.Form 

任何思考如何實現這一目標?

+0

你說的是Java或C#? – 2012-01-07 18:54:27

+0

爲什麼java標籤?這顯然是C#代碼。 – GolfWolf 2012-01-08 14:25:01

+0

對不起,這是一個錯字。修復。 – 2012-01-08 14:35:05

回答

2

而是第一構建的,你可以使用

class Computer<T> : System.Windows.Forms.Form where T : ICloneable<T> 

取而代之的是第二個,你可以使用

class Computer <T, TCloneable>: System.Windows.Forms.Form 
    where TCloneable : ICloneable<T>  
+0

謝謝!我找不到這樣的例子。不知道用什麼組合搜索關鍵字。如果你知道任何解釋這種結構的文章,請告訴我。我發現的所有東西都是泛型接口繼承,但沒有與類繼承相結合。 – 2012-01-08 14:38:43

+0

第二個構造是我使用的構造。關於第一個,這是不是意味着向計算機類發送兩個不同的對象?如果是的話,那麼這將在我的特定環境中設計不好,因爲T對象是需要實現ICloneable的。我認爲這是否正確? – 2012-01-08 14:40:46

+0

在第一種情況下的約束意味着類'T'也應該實現'ICloneable '。所以它可能是一個單一的對象。例如,它可能是您的「實體」類的實例 - 公共類實體:ICloneable < Entity > - 在這種情況下,此類的任何實例都是「實體」,但也是「ICloneable 」。只能根據上下文來判斷這種設計的好壞。 – GolfWolf 2012-01-08 15:22:06