كيف يمكنني جعل هذا العمل البسيط C# Generics Factory؟

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

الوهمية 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)];
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top