3

クラスの 1 つのコンストラクターに複数のジェネリック インターフェイスをパラメーターとして渡そうとしています。

次のコードはコンパイルされません。

public interface IPosterGenerator<T>
{
    IQueryable<T> GetPosters();
}

public class Pinboard
{
    public Pinboard(IPosterGenerator<A> firstPosterGenerator, IPosterGenerator<B> secondPosterGenerator, IPosterGenerator<B> thirdPosterGenerator)
    { 
    }
}

私は約100種類のポスタージェネレーターを持っています。それらはすべて IPosterGenerator インターフェースから継承します。新しいピンボードをインスタンス化するとき、ピンボードのコンストラクターに 3 つの IPosterGenerators を渡す必要があります。ただし、これら 3 つの IPosterGenerators はそれぞれ異なるタイプになります。だからこそ、私はこのばかげた A、B、C を思いついたのです。

これはまったくできますか?

4

3 に答える 3

6

Pinboardおそらくジェネリックにしたいようです:

public class Pinboard<T1, T2, T3>
{
    public Pinboard(IPosterGenerator<T1> generator1,
                    IPosterGenerator<T2> generator2,
                    IPosterGenerator<T3> generator3)
    {
         ...
    }
}

呼び出しを簡単にするために、ジェネリック メソッドを使用して非ジェネリック クラスを作成することもできます。

public static class Pinboard
{
    public static Pinboard<T1, T2, T3> Create(IPosterGenerator<T1> generator1,
                                              IPosterGenerator<T2> generator2,
                                              IPosterGenerator<T3> generator3)
    {
        return new Pinboard<T1, T2, T3>(generator1, generator2, generator3);
    }
}

次に、ジェネレーターを既に取得している場合は、次のように呼び出すことができます。

// Or whatever...
var board = Pinboard.Create(bigGenerator, smallGenerator, mediumGenerator);
于 2013-02-18T17:30:40.127 に答える
1

クラスをA、B、Cでもジェネリックとして宣言する必要があります。このようなもの:

public class Pinboard<A,B,C> {
  public Pinboard(IPosterGenerator<A> firstPosterGenerator,
                  IPosterGenerator<B> secondPosterGenerator,
                  IPosterGenerator<C> thirdPosterGenerator) { 
  }
}
于 2013-02-18T17:32:37.593 に答える
0

私の元の質問で十分に正確でなかったことをもう一度申し訳ありません。これが私にとっては問題ないとわかったものです(そして私のニーズに十分柔軟です):

public interface IPosterGenerator
{
}

public interface IPosterGenerator<T> : IPosterGenerator
{
    IQueryable<T> GetPosters();
}

public class Pinboard
{
    public Pinboard(List<IPosterGenerator> generators) 
    {

    }
}

皆様のサポートに改めて感謝いたします。

于 2013-02-19T04:52:30.063 に答える