1

重複の可能性:
C# ジェネリックは、C++ テンプレートのようにジェネリック型パラメーターの 1 つから派生できないのはなぜですか?
ジェネリック型を継承するジェネリック クラス

C#でのみ、このようなことができるようにしたいと思います:

template<class MyClass>
class MockComposite : MyClass
{

};

上記のクラスは、指定された型から継承されます。MyClass は基本型であり、これがこの動作が必要な理由です。MyClass から派生したクラスでこのオブジェクトをインスタンス化できるようにしたいと考えています。

C# でテンプレートを使用できないことは理解していますが、オブジェクトの種類ごとに新しいクラスを作成することなく、必要な動作を得る方法はありますか?

編集-クラスが指定されたタイプ「MyClass」から派生している限り、クラスの動作をテストするオブジェクトをインスタンス化できるようにしたいと考えています。

4

2 に答える 2

1

C# には、ジェネリックの概念があります。次のコードは、C++ コードと同等です。

class MockComposite<T> : T
    where T : MyClass
{
}

残念ながら無効です。次のコンパイル エラーが発生します。

'T' は型パラメーターであるため、派生できません

C# では、通常、この問題を継承ではなく構成で解決します。

この場合のコンポジションは、次の 2 つのいずれかを意味します。

  1. クラスにはまだジェネリック引数がありますが、そこから派生しようとはしていません。さらに、new制約があります。つまり、ジェネリック引数にはデフォルトのコンストラクターが必要です。

    class MockComposite<T>
        where T : MyClass, new()
    {
        T _toTest;
    
        public MockComposite()
        {
            _toTest = new T();
        }
    }
    

    これは、このようにモック クラスをインスタンス化できることを意味します。モック クラスの外側で のvar mock = new MockComposite<ClassA>();インスタンスを作成する必要はありません。ClassA

    class MockComposite
    {
        MyClass _toTest;
    
        public MockComposite(MyClass toTest)
        {
            _toTest = toTest;
        }
    }
    

    これは、次のようにモック クラスをインスタンス化する必要があることを意味します。var mock = new MockComposite(new ClassA());

于 2012-08-28T14:54:51.723 に答える
0

これは C# ではまったく不可能です。しかしこれは、ある言語を別の異なる言語として使用しようとするケースです。C++ では、このパターンに用途があります。C# でも同じことができますが、異なる手法を使用します。

多分これはあなたを助けるでしょう:

class Myclass
{
}

class ChildClass : MyClass
{
}

class MockComposite<T> where T : MyClass
{
    public MockComposite(T objectToTest) { ... }
}

ここでは、から派生した any クラスを に渡すことができMyClassますCompositeTester<>。これとあなたのコードの最大の違いは、ここでは を継承する実際の既存の非ジェネリック クラスを渡す必要があることMyClassです。一般的に継承しようとしていますが、これは不可能です。

C++ では、これは基本的に次のようになります。

class Myclass
{
};

class ChildClass : MyClass
{
};

template<typename T>
class MockComposite
{
public:
    MockComposite(const T& objectToTest) { ... }
};

C# のジェネリックは C++ のテンプレートに少し似ているかもしれませんが、まったく別の考え方です。C++ テンプレートを使用すると、ほとんどマクロのように柔軟にできますが、ジェネリックは、型に関してかなり厳密なままです。明示的にできると言っていないジェネリック型では何もできないため、 のようなジェネリック制約where T : MyClass。を指定することで、としてMockComposite.MockComposite使用できます。TMyType

于 2012-08-28T14:55:05.110 に答える