كيف يمكنني جعل هذا العمل البسيط C# Generics Factory؟
سؤال
لدي هذا التصميم:
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>
س؟ الجواب الساذج هو 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)];
}
}