Как я могу сделать эту простую работу C # Generics Factory?
Вопрос
У меня есть этот дизайн:
public interface IFactory<T> {
T Create();
T CreateWithSensibleDefaults();
}
public class AppleFactory : IFactory<Apple> { ... }
public class BananaFactory : IFactory<Banana> { ... }
// ...
Фиктивные Apple
а также Banana
здесь не обязательно разделяют все общие типы (кроме object
, конечно).
Я не хочу, чтобы клиенты должны были зависеть от конкретных фабрик, поэтому вместо этого вы можете просто спросить FactoryManager
для нового типа. Оно имеет FactoryForType
Метод:
IFactory<T> FactoryForType<T>();
Теперь вы можете вызвать соответствующие интерфейсные методы с чем-то вроде FactoryForType<Apple>().Create()
. Отказ Все идет нормально.
Но есть проблема на уровне реализации: как я могу хранить это отображение от типов в IFactory<T>
S? Наивный ответ - это IDictionary<Type, IFactory<T>>
, но это не работает, так как нет ни одного типа ковариации на T
(Я использую C # 3.5). Я просто застрял с IDictionary<Type, object>
И делать кастинг вручную?
Решение
К сожалению, да, вы застряли с руководством литья. Однако это литье может быть деталей реализации и не наблюдается потребителем. Например
public class FactoryMap {
private Dictionary<Type,object> _map = new Dictionary<Type,object>();
public void Add<T>(IFactory<T> factory) {
_map[typeof(T)] = factory;
}
public IFactory<T> Get<T>() {
return (IFactory<T>)_map[typeof(T)];
}
}