0

コンテキスト: これは、将来のユーザーがエンジン自体の内部動作に関係なく動作の特定の部分を拡張できるように、汎用クラスでいっぱいのエンジン用です。

今、クラス C が必要です。

public class C
{
    public C Copy(params) { ... }
}

しかし、拡張クラス D:

public class D : C
{
    public D Copy(params) { ... }
}

基本的にはいくつかのジェネリック クラスがありますが、適切な型を返すコピー メソッド (実際には「新しい場所にコピーを作成する」メソッドですが、重要ではありません) が必要です。

public class SampleClass<T>
    where T : C
{
    public void Stuff()
    {
        ...
        T copy = favoriteThing.Copy(params);
        ...
    }
}

キャストして、将来の実装者がそれを正しくすることを信頼することもできますが、契約ですべてを明示することをお勧めします。これを行うエレガントな方法はありますか?

4

1 に答える 1

2

1 つの方法は、 andICopyable<T>によって実装されるインターフェイスを定義することです。CD

public interface ICopyable<T>
{
    T Copy(params);
}

public class C : ICopyable<C> { ... }
public class D : C, ICopyable<D> { ... }

SampleClass<T>が に制約Tされている場合、キャストなしで型のオブジェクトをICopyable<T>呼び出して取得できます。CopyT

public class SampleClass<T>
    where T : C, ICopyable<T> // added constraint
{
    public void Stuff()
    {
        T favoriteThing = ...
        ...
        ICopyable<T> copyable = favoriteThing;
        T copy = copyable.Copy(params); // no cast needed
        ...
    }
}
于 2012-12-01T16:27:36.263 に答える