2012-01-07 28 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