Я использую иерархию общих классов коллекции, которые наследуются от абстрактного базового класса, для хранения элементов сущностей, которые также являются производными от абстрактного базового класса:
abstract class ItemBase { }
class MyItem : ItemBase
{
public MyItem()
{
}
}
abstract class CollectionBase<T> : Collection<T> where T : ItemBase, new() { }
class MyCollection : CollectionBase<MyItem> { }
Задачи этой модели - обеспечить строгую дисциплину типов для членов любого класса, производного от CollectionBase , и гарантировать, что эти члены имеют открытый конструктор по умолчанию. Пока это работает.
Теперь я хочу создать фабричный метод, который возвращает экземпляр класса, производного от CollectionBase . Я понимаю, что обычный подход будет:
public CollectionBase<T> CreateCollection<T>();
... или, может быть ...
public T Create CreateCollection<T>();
Однако проблема в том, что вызывающая подпрограмма не знает, какой "Т" требуется. Это сам фабричный метод, который должен определить конкретный тип возвращаемой коллекции. Поэтому мне нужна неуниверсальная сигнатура метода, которая говорит, что «возвращаемый тип будет производным от CollectionBase ». Я предполагаю что-то подобное (если бы это было законно) ...
public CollectionBase<> CreateCollection();
Я предполагаю, что это еще одна из этих непростых проблем общего характера, но даже после прочтения подробного объяснения Эрика Липперта по этому вопросу, я до сих пор не понимаю, возможно ли то, что я пытаюсь сделать, в C # 4.0 и возможно ли простой обходной путь в C # 3.0.
Заранее спасибо за ваши идеи.