この投稿は、昨日の私の元の投稿に基づいています。しかし、私は自分のニーズについて十分に正確ではなかったので、ここでもう一度やり直します.
私の現在のコードを見てください:
public interface IPosterGenerator<T>
{
IQueryable<T> GetPosters();
}
public class PetPosterGenerator : IPosterGenerator<PetPoster>
{
IQueryable<PetPoster> GetPosters()
{
return busLogic.GetPetPosters();
}
}
public class FlowerPosterGenerator : IPosterGenerator<FlowerPoster>
{
IQueryable<FlowerPoster> GetPosters()
{
return busLogic.GetFlowerPosters();
}
}
public class PinBoard
{
protected List<IPosterGenerator> PosterGenerators { get; set; } // 1. compiler error
public PinBoard(List<IPosterGenerator> generators) // 2. compiler error
{
this.PosterGenerators = generators;
}
public List<BasePoster> GetPosters()
{
var posters = new List<BasePoster>();
foreach (var generator in PosterGenerators)
{
posters.Add(generator.GetPosters());
}
return posters;
}
}
私の目標は、ポスターのリストを返すことができる「ピンボード」を作成することです。各ポスターは、異なるタイプ (ペットのポスター、花のポスターなど) にすることができます。すべてのポスターは、まったく異なる外観、内容などを持っています。しかし、それらはすべて BasePoster クラスを継承しています。
全部で約100種類のポスターを用意する予定です。具体的な PinBoard インスタンスには、1000 枚のポスターと、さまざまな種類のポスターを (さまざまな順序で) 簡単に含めることができます。
特定の PinBoard のポスターを作成するには、PinBoard に特定のポスター ジェネレーターのリストを入力する必要があります (ジェネレーターの量と種類はコンテキストに応じて変わります)。ポスター タイプごとに 1 つのポスター ジェネレーターがあります (たとえば、ペット ポスターのコレクションを生成する PetPosterGenerator)。
すべてのポスター ジェネレーターが同じ (タイプ セーフな) インターフェイスを共有できればいいと思いました。そのため、IPosterGenerator インターフェイスを導入しました。
私の問題は、コードがコンパイルされないことです。同じエラー メッセージを伴う 2 つのコンパイラ エラーがあります: Using the generic type 'myApp.IPosterGenerator' requires 1 type arguments
これらの場所でタイプを定義していないため、エラー メッセージに驚くことはありません。最初のエラーの行で次のようなことができれば素晴らしいでしょう:
protected List<IPosterGenerator<T>> PosterGenerators { get; set; }
しかし、これを行うと、コンパイラは型または名前空間 T を見つけることができません。
今、私はちょっと迷っています。結局、一般的な IPosterGenerator インターフェースを使用することはあまり良い考えではないかもしれません。しかし、アプリケーションのある時点で、特定の IPosterGenerator が表す具体的なポスターの種類を知るかアクセスする必要があると確信しています。
皆さんはこれにどのようにアプローチしますか?よろしくお願いいたします。