ОБЩИЙ ИНТЕРФЕЙС :
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
Есть мысли о том, как этого добиться?