Как я могу сделать эту простую работу C # Generics Factory?

StackOverflow https://stackoverflow.com/questions/2867196

  •  30-09-2019
  •  | 
  •  

Вопрос

У меня есть этот дизайн:

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)];
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top