17

次のように、ジェネリック型パラメーターに「派生元」制約を指定できます。

class Bar<T> where T : IFooGenerator

NOTの派生元を指定する方法はありますか?


私のユースケース: 並列化可能な多数のFooGenerators があり、それぞれに同じ並列化コードがありますが、それらを常に並列化する必要はありません。

public class FooGenerator : IFooGenerator
{
    public Foo GenerateFoo() { ... }
}

したがって、並列で Foo を生成するための汎用コンテナー クラスを作成します。

public class ParallelFooGenerator<T> : IFooGenerator where T : IFooGenerator
{
    public Foo GenerateFoo()
    {
        //Call T.GenerateFoo() a bunch in parallel
    }
}

FooGeneratorParallelFooGenerator<FooGenerator>交換したいので にしますParallelFooGenerator : IFooGeneratorParallelFooGenerator<ParallelFooGenerator>しかし、私は明らかに合法的になりたくありません。

したがって、補助的な質問として、「派生していない」制約が不可能な場合、これを設計するためのより良い方法はおそらくありますか?

4

3 に答える 3

10

次のようなものを使用できます。

public interface IFooGenerator
{
    Foo GenerateFoo();
}

interface ISerialFooGenerator : IFooGenerator { }

interface IParallelFooGenerator : IFooGenerator { }

public class FooGenerator : ISerialFooGenerator
{
    public Foo GenerateFoo()
    {
        //TODO
        return null;
    }
}

public class ParallelFooGenerator<T> : IParallelFooGenerator
    where T : ISerialFooGenerator, new()
{
    public Foo GenerateFoo()
    {
        //TODO
        return null;
    }
}
于 2012-06-25T18:25:32.793 に答える
7

ParallelFooGenerator<ParallelFooGenerator>ParallelFooGeneratorはジェネリック型であり、ジェネリック引数を指定していないため、既に可能ではありません。

たとえば、ParallelFooGenerator<ParallelFooGenerator<SomeFooGenerator>>可能です - そして、そのようなタイプを許可することは本当に悪いことでしょうか?

于 2012-06-25T18:20:58.360 に答える
4

簡単な答えはノーです。

長い答え(まだいいえ):

Microsoft は、型の制約についての説明で次のように説明しています。

制約の基本的な目的は、特定の型の使用を禁止することではなく、サポートされている演算子またはメソッドをコンパイラが認識できるようにすることです。ただし、型が実行時に特定のインターフェイス/基本クラスを実装/継承しているかどうかを確認し、例外をスローすることはできます。ただし、これにより、IntelliSense から設計時エラーを取得することはできなくなります。

これが役立つことを願っています。

于 2012-06-25T18:24:39.867 に答える