Как я могу заставить эту простую фабрику обобщений C # работать? - PullRequest
4 голосов
/ 19 мая 2010

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

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> и выполняю кастинг вручную?

1 Ответ

5 голосов
/ 19 мая 2010

К сожалению, да, вы застряли с ручным литьем. Однако этот отлив может быть деталью реализации и не виден потребителю. Например

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)];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...