このシンプルなc#ジェネリックファクトリーを機能させるにはどうすればよいですか?
質問
私はこのデザインを持っています:
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)];
}
}
所属していません StackOverflow