هل هناك طريقة لجعل منشئ مرئية فقط إلى فئة الأم في C# ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي مجموعة من الفئات التي ترث من فئة مجردة أنا خلقت.أود أن استخدام خلاصة الدرجة كما مصنع خلق حالات ملموسة تطبيقات من فئة مجردة.

هل هناك أي طريقة لإخفاء منشئ من كل رمز ما عدا الفئة الأصل.

أود أن تفعل هذا الأساس

public abstract class AbstractClass
{
    public static AbstractClass MakeAbstractClass(string args)
    {
        if (args == "a")
            return new ConcreteClassA();
        if (args == "b")
            return new ConcreteClassB();
    }
}

public class ConcreteClassA : AbstractClass
{
}

public class ConcreteClassB : AbstractClass
{
}

ولكن أريد أن منع أي شخص من مباشرة إنشاء 2 فئات محددة.كنت ترغب في التأكد من أن فقط MakeAbstractClass() الطريقة يمكن إنشاء قاعدة الطبقات.هل هناك أي طريقة للقيام بذلك ؟

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

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

أعتقد لا يوجد حل سهل لهذه...

هل كانت مفيدة؟

المحلول

يمكنك جعل فئات فرعية الطفل دروس شيئا من هذا القبيل:

public abstract class AbstractClass
{
    public static AbstractClass MakeAbstractClass(string args)
    {
        if (args == "a")
            return new ConcreteClassA();
        if (args == "b")
            return new ConcreteClassB();
    }

    private class ConcreteClassA : AbstractClass
    {
    }

    private class ConcreteClassB : AbstractClass
    {
    }
}

@Vaibhav هذا يعني أن الطبقات مخفية أيضا.ولكن هذا هو بقدر ما أنا على علم الطريقة الوحيدة لإخفاء تماما منشئ.

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

نصائح أخرى

لي أبسط حل هو جعل الطفل الطبقات كما samjudson المذكورة.أود أن تجنب هذا ومع ذلك منذ ما فئة مجردة' الملف أكبر بكثير من أود أن يكون.أنا أفضل أن تبقى دروس تقسيم على عدد قليل من الملفات المنظمة.

لا مشكلة, فقط استخدام جزئية الكلمات الرئيسية و يمكنك تقسيم الطبقات الداخلية في العديد من الملفات كما تريد.لا يجب أن يبقيه في نفس الملف.

الإجابة السابقة:

هذا ممكن ولكن فقط مع انعكاس

public abstract class AbstractClass
{
    public static AbstractClass MakeAbstractClass(string args)
    {
        if (args == "a")
            return (AbstractClass)Activator.CreateInstance(typeof(ConcreteClassA), true);
        if (args == "b")
            return (AbstractClass)Activator.CreateInstance(typeof(ConcreteClassB), true);
    }
}

public class ConcreteClassA : AbstractClass
{
    private ConcreteClassA()
    {
    }
}

public class ConcreteClassB : AbstractClass
{
    private ConcreteClassB()
    {
    }
}

و هنا هو نمط آخر ، دون القبيح MakeAbstractClass(string args)

public abstract class AbstractClass<T> where T : AbstractClass<T>
{
    public static T MakeAbstractClass()
    {
        T value = (T)Activator.CreateInstance(typeof(T), true);
        // your processing logic
        return value;
    }
}

public class ConcreteClassA : AbstractClass<ConcreteClassA>
{
    private ConcreteClassA()
    {
    }
}

public class ConcreteClassB : AbstractClass<ConcreteClassB>
{
    private ConcreteClassB()
    {
    }
}

اذا كان العدد في نفس الجمعية ، يمكنك أن لا تجعل منشئات الداخلية ؟

لا, أنا لا أعتقد أننا يمكن أن نفعل ذلك.

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

هل فعلا تحتاج أن تفعل هذا ؟ إذا كنت تستخدم نوع الزائفة نمط مصنع بدون الحقيقية تصميم الحاجة إلى ذلك ، أنت لن يؤدي إلا إلى جعل التعليمات البرمجية الخاصة بك من الصعب فهم على تمديد.

إذا كنت لا تحتاج إلى القيام بذلك فقط تنفيذ الحقيقية نمط مصنع.أو أكثر ALTy ، واستخدام دي/IoC الإطار.

لا يمكنك استخدام الكلمات الرئيسية partial من أجل تقسيم البرمجية لفئة إلى العديد من الملفات ؟

إذا كنت تستخدم هذه الفئة في تفريق التجمع الخدمة ، يمكنك استخدام الداخلية الكلمة.

public class AbstractClass
{
    public AbstractClass ClassFactory(string args)
    {
        switch (args)
        {
            case "A":
                return new ConcreteClassA();               
            case "B":
                return new ConcreteClassB();               
            default:
                return null;
        }
    }
}

public class ConcreteClassA : AbstractClass
{
    internal ConcreteClassA(){ }
}

public class ConcreteClassB : AbstractClass
{
    internal ConcreteClassB() {}
}

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

public abstract class AbstractClass{

 public static AbstractClass MakeAbstractClass(string args)
 {
    if (args == "a")
        return ConcreteClassA().GetConcreteClassA();
    if (args == "b")
        return ConcreteClassB().GetConcreteClassB();
 }
}

public class ConcreteClassA : AbstractClass
{
  private ConcreteClassA(){}

  internal static ConcreteClassA GetConcreteClassA(){
       return ConcreteClassA();
  }
}

public class ConcreteClassB : AbstractClass
{
  private ConcreteClassB(){}
  internal static ConcreteClassB Get ConcreteClassB(){
       return ConcreteClassB();
  }

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