C #: تحديد نوع الكائن المستمدة من أسلوب ثابت الفئة الأساسية

StackOverflow https://stackoverflow.com/questions/300181

سؤال

في برنامج C #، لدي فئة قاعدة مجردة مع ساكنة "إنشاء" الأسلوب. يتم استخدام الأسلوب إنشاء لإنشاء مثيل من فئة وتخزينها محليا لاستخدامها لاحقا. منذ الفئة الأساسية هي مجردة، والأجسام تنفيذ تستمد دائما من ذلك.

وأريد أن أكون قادرة على استخلاص كائن من الفئة الأساسية، والدعوة إنشاء أسلوب ثابت (تنفذ مرة واحدة في الفئة الأساسية) من خلال فئة مشتقة، وإنشاء مثيل من الكائن المشتقة.

هل هناك أية مرافق داخل C # لغة من شأنها أن تسمح لي أن سحب هذا. موقفي تراجع الحالي هو لتمرير مثيل من فئة مشتقة باعتبارها واحدة من الحجج إلى وظيفة خلق، أي:

objDerived.Create(new objDerived(), "Arg1", "Arg2");
هل كانت مفيدة؟

المحلول

وحاول استخدام الأدوية:

public static BaseClass Create<T>() where T : BaseClass, new()
{
    T newVar = new T();
    // Do something with newVar
    return T;
}

واستخدام عينة:

DerivedClass d = BaseClass.Create<DerivedClass>();

نصائح أخرى

موجز

وهناك خياران رئيسيان. واحدة من أجمل وأحدث هو استخدام الأدوية، والآخر هو لاستخدام التفكير. انا توفير كل في حال كنت بحاجة إلى تطوير الحل الذي يعمل قبل Framework 2.0.

الوراثة

abstract class BaseClass
{
  public static BaseClass Create<T>() where T : BaseClass, new()
  {
    return new T();
  }
}

وأين استخدام ستكون كما يلي:

DerivedClass derivedInstance = BaseClass.Create<DerivedClass>();

انعكاس

abstract class BaseClass
{
  public static BaseClass Create(Type derivedType)
  {
    // Cast will throw at runtime if the created class
    // doesn't derive from BaseClass.
    return (BaseClass)Activator.CreateInstance(derivedType);
  }
}

وأين استخدام ستكون (مقسمة على خطين لهذين):

DerivedClass derivedClass
    = (DerivedClass)BaseClass.Create(typeof(DerivedClass));

وترغب في إنشاء مثيل جديد من المستمدة من داخل مثيل آخر من المشتقة، وذلك باستخدام أسلوب مصنع ثابت على الفئة الأساسية مجردة؟ إذا كان الأمر كذلك، وأنا أتساءل لماذا ... ولكن ...

 public abstract class MyBase
 {
    public static T GetNewDerived<T>() where T : MyBase, new()
    {
        return new T();
    }    
 }
 public class DerivedA : MyBase
 {
    public static DerivedA GetNewDerived()
    {
        return GetNewDerived<DerivedA>();
    }
 }

 public class DerivedB : MyBase
 {
    public static DerivedB GetNewDerived()
    {
        return GetNewDerived<DerivedB>();
    }
 }     

هل هذا ما تريد؟

ويبدو أنك تحتاج إلى إجراء إنشاء () طريقة مجردة. وبمجرد الانتهاء من ذلك قد قمت بإعادة تسمية أنها كذلك وجعله منشئ كذلك. ثم هل يمكن أن يكون أسلوبا مختلفا التهيئة () أن استدعاء بعد يتم إنشاء الكائن إذا كنت بحاجة إلى ذلك، وسوف آثار تعدد الأشكال العادية التعامل مع الأشياء.

وأنت لا تستطيع أن تفعل ذلك من دون معلومات خارجية. إما نوع من فئة مشتقة، مثيل، أو اسم مؤهل بشكل كامل من فئة مشتقة. أي من هؤلاء أي ما يعادل ما تفعلونه بالفعل؛ ليس هناك حل أفضل أنا على علم. إن طبيعة أساليب ثابتة تستبعد أي شيء أكثر أناقة.

ولست متأكدا ما هي أهداف التصميم الخاص بك ولكن من ما طلبتم يبدو أنه قد ينتهي مع الكثير من رائحة التعليمات البرمجية. أعتقد أن عليك أن تنظر حقا إلى عكس أنماط التصميم (DI) التحكم (IOC) / التبعية حقن التي يتم تنفيذها في أطر عديدة مثل مايكروسوفت الوحدة، قلعة وندسور، StructureMap، Ninject، Spring.Net وهكذا دواليك.

واعتقد انه اذا نظرتم باستخدام حاوية اللجنة الاولمبية الدولية فإنه سيتم حل مشكلتك بطريقة أنظف بكثير والمتباعدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top