私は、1つのオブジェクトの内容を同じタイプの別のオブジェクトにコピーするという方法でインターフェイスを作成しました(実際の機能は質問とは関係ありません)。一般的なメソッドの実装
public interface IDeepClonable
{
void DeepClone<T>(T other);
}
適切な実装に問題があります。私は本当にたい何
は「その他」のオブジェクトは次のように認識されないよう、
public void DeepClone<ClassA>(ClassA other)
{
this.A = other.A;
}
は、しかし、これは動作しません(これはIDeepClonableを実装にClassA、内側にある場合)は、このようにそれを実装することです(なぜ?)
これは、型パラメータTの制約が(...)インタフェースメソッドと一致しなければならないため、どちらも動作しません。
public void DeepClone<T>(T other) where T : ClassA
{
this.A= other.A;
}
一般的な制約の代わりにオブジェクトを取り込むようにインターフェイスを変更することで、すべての問題を解決できますが、私はより洗練されたソリューションを望んでいました。
これを解決するには、インターフェイスを汎用インターフェイスに変更しますが、そのインターフェイスを汎用インターフェイスにキャストする必要があります。
。 'DeepClone'という名前のメソッドはコピーを返さなければなりません。あなたは 'DeepCloneFrom'かそれに類するものに名前をつけるべきです。 – SLaks
あなたが深いクローン作成をしたいならば、メソッド 'T AsImmutable()'、 'IModifiableClone 'とメソッド 'U AsNewMutable()'を使って 'IImmutableClonable'を定義し、 'IFullClone 'は上記の両方を継承しています。変更不能なオブジェクトは、単に 'AsImmutable()'実装から自分自身を返すでしょう。 'AsNewMutable()'は、少なくとも 'U'の契約で必要とされる突然変異の方法を許可するものを返します。 –
supercat