0

基本的に私の設定はこれです:

public abstract class BaseObject{
    public abstract BaseObject Clone();
}

public class DerivedObject : BaseObject{
    public DerivedObject Clone()
    {
        //Clone logic
    }
}

メソッドをオーバーライドするときに戻り値の型を変更できないため、上記のコードはコンパイルされません。

すべての派生型の Clone メソッドが独自の型の引数を返すことを達成することは可能ですか (おそらくジェネリックを介して)?

4

2 に答える 2

3

さて、あなたが見つけたように、C#は共変の戻り値の型を許可していません...しかし、ジェネリックを使用できます:

public abstract class BaseObject<T> where T : BaseObject<T>
{
    public abstract T Clone();
}

public class DerivedObject : BaseObject<DerivedObject>
{
    public override DerivedObject Clone()
    {
         // ...
    }
}

この解決策は、さまざまな点で苦痛になる可能性があります (特に、理解するのが難しいため) が、多くの状況で十分に機能します。

編集: T に制約を含めた理由はBaseObject、 のインスタンスで「独自の」メソッドを呼び出すことができるようにするためですT。これは通常非常に便利です。ただし、これが必要ない場合は、制約を失う可能性があります。

于 2009-08-07T20:35:47.297 に答える
0

このようなことができます。default(T) を返す代わりに、複製ロジックに基づいて何かを返します。

public class MyBase<T>
{
    public T Clone()
    {
        return default(T);
    }
}

public class MyDerived : MyBase<MyDerived>
{
}

ところで、オブジェクトのクローン作成では、バイナリ シリアライザーを使用して現在のオブジェクトをメモリにシリアル化し、そのメモリを逆シリアル化して新しいインスタンスに戻します。

于 2009-08-07T20:37:53.907 に答える