Явный универсальный интерфейс с наследованием классов - PullRequest
0 голосов
/ 07 января 2012

ОБЩИЙ ИНТЕРФЕЙС :

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

КЛАСС : Реализация универсального интерфейса:

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

ИЛИ

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

Есть мысли о том, как этого добиться?

1 Ответ

3 голосов
/ 07 января 2012

Вместо первой конструкции вы можете использовать

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

Вместо второго вы можете использовать

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