簡単な答え: できません。
A.Copy()
型を返すためA
、 を返すように変更することはできませんB
。
オブジェクトには、すべてのフィールドを新しいオブジェクトにコピーするメソッドが既に存在します。と呼ばれていobject.MemberwiseClone()
ます。ただし、浅いコピーを実行するため、これには注意してください。(すべての参照型メンバーが既存のオブジェクトを指すことを意味します)。
私が見つけたところによると、通常はディープ コピーが必要ですが、残念ながらこれは、に含めることができるすべてのクラスに「ディープ コピー」メソッドを記述する必要があることを意味しますA
。
メソッドは通常、ディープ コピーであるClone()
と理解されています。(コメントはいつも助けになります)そして、それは戻ってきますobject
。B
バックが必要な場合は、キャストが必要です。継承されたメソッドの署名を変更できないため、これを回避する良い方法はありません。
new
もう 1 つ:関数を定義するときにキーワードを使用しないでください。ポリモーフィズムが壊れ、見つけにくいバグが発生する可能性があります。
public class A : IClonable {
public ReferenceType member1;
public int member2;
public object Clone() {
var clone = this.MemberwiseClone() as A; //shallow copy
clone.CloneReferenceMembers(); //deep copy
return clone;
}
public virtual void CloneReferenceMembers(){
this.member1 = this.member1.Clone();
}
}
public class B : A {
public AnotherReferenceType member3;
public int member4;
public override void CloneReferenceMembers(){
base.CloneReferenceMembers();
this.member3 = this.member3.Clone();
}
}