抽象基本クラスから派生するジェネリック コレクション クラスの階層を使用して、抽象基本クラスからも派生するエンティティ項目を格納しています。
abstract class ItemBase { }
class MyItem : ItemBase
{
public MyItem()
{
}
}
abstract class CollectionBase<T> : Collection<T> where T : ItemBase, new() { }
class MyCollection : CollectionBase<MyItem> { }
このモデルの目的は、CollectionBase<T> から派生したクラスのメンバーに厳密な型規則を適用し、これらのメンバーが既定のパブリック コンストラクターを持つことを保証することです。これまでのところ、動作します。
ここで、CollectionBase<T> から派生したクラスのインスタンスを返すファクトリ メソッドを作成したいと考えています。通常のアプローチは次のようになることを理解しています。
public CollectionBase<T> CreateCollection<T>();
... または多分 ...
public T Create CreateCollection<T>();
ただし、問題は、呼び出し元のルーチンが必要な "T" を認識していないことです。返す特定のタイプのコレクションを決定する必要があるのは、ファクトリ メソッド自体です。したがって、「戻り値の型は CollectionBase<T> から派生する」という非ジェネリック メソッド シグネチャが必要です。私はこのようなことを想定しています(合法であれば)...
public CollectionBase<> CreateCollection();
これは厄介なジェネリック分散の問題の 1 つだと思いますが、この件に関する Eric Lippert の広範な説明を読んだ後でさえ、私がやろうとしていることが C# 4.0 で実行可能であるかどうか、および単純な方法があるかどうかはまだわかりません。 C# 3.0 での回避策。
あなたのアイデアを前もってありがとう。