4

私はこのデザインを持っています:

public interface IFactory<T> {
  T Create();
  T CreateWithSensibleDefaults();
}

public class AppleFactory : IFactory<Apple> { ... }
public class BananaFactory : IFactory<Banana> { ... }
// ...

架空のものAppleBananaここでは、必ずしも共通のタイプを共有しているわけではありません(objectもちろん、それ以外)。

クライアントが特定の工場に依存する必要はないので、代わりにFactoryManager、新しいタイプを要求することができます。それにはFactoryForType方法があります:

IFactory<T> FactoryForType<T>();

これで、のようなものを使用して適切なインターフェイスメソッドを呼び出すことができますFactoryForType<Apple>().Create()。ここまでは順調ですね。

しかし、実装レベルで問題があります。タイプからIFactory<T>sへのこのマッピングをどのように保存するのですか?素朴な答えはですが、 (私はC#3.5を使用しています)にIDictionary<Type, IFactory<T>>型の共分散がないため、それは機能しません。T私はただで立ち往生してIDictionary<Type, object>いて、手動でキャストをしていますか?

4

1 に答える 1

5

残念ながら、はい、手動キャストで立ち往生しています。ただし、このキャストは実装の詳細であり、消費者には見えない可能性があります。例えば

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)];
  }
}
于 2010-05-19T15:59:50.120 に答える