このシンプルなc#ジェネリックファクトリーを機能させるにはどうすればよいですか?

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> { ... }
// ...

架空の AppleBanana ここでは、必ずしも一般的なタイプを共有しているわけではありません(以外 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