كيف يمكنني منع استدعاء المنشئ الأساسي بواسطة وريث في C#؟

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

سؤال

لدي فئة أساسية (سيئة الكتابة) أريد تغليفها في كائن وكيل.تشبه الفئة الأساسية ما يلي:

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   public BaseClass(int someValue) {}

   //...more code, not important here
}

والوكيل الخاص بي يشبه:

public BaseClassProxy : BaseClass
{
  public BaseClassProxy(bool fakeOut){}
}

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

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

المحلول

إذا كنت لا تدعو صراحة أي منشئ في الفئة الأساسية، وسوف يطلق منشئ parameterless ضمنا. ليس هناك طريقة من حوله، لا يمكنك مثيل فئة دون منشئ يتم استدعاء.

نصائح أخرى

وهناك وسيلة لخلق كائن دون استدعاء <م> أي الصانعين المثال.

وقبل المتابعة، تأكد جدا كنت تريد أن تفعل ذلك بهذه الطريقة. 99٪ من الوقت هذا هو الحل الخاطئ.

وهذا هو كيف نفعل ذلك:

FormatterServices.GetUninitializedObject(typeof(MyClass));

ويطلق عليه في مكان منشئ الكائن. فإنه سيتم إنشاء والعودة لك مثيل دون استدعاء أي منشئات أو المهيآت المجال.

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

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

إذا كان ما تريد هو لا استدعاء أي من منشئي الفئة الأساسية، لا يمكن القيام بذلك.

يجب على منشئي فئة C# استدعاء منشئي الفئة الأساسية.إذا لم تتصل بأحد بشكل صريح، قاعدة( ) هو ضمني.في المثال الخاص بك، إذا لم تحدد مُنشئ الفئة الأساسية الذي تريد الاتصال به، فسيكون الأمر مماثلاً لما يلي:

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base() { }
}

إذا كنت تفضل استخدام مُنشئ الفئة الأساسية الأخرى، فيمكنك استخدام:

public BaseClassProxy : BaseClass
{
    public BaseClassProxy() : base(someIntValue) { }
}

وفي كلتا الحالتين، واحدة من الاثنين سوف أن يطلق عليه صراحة أو ضمنا.

وأنا لا أعتقد أنك يمكن أن تحصل حول استدعاء المنشئ. ولكن هل يمكن أن تفعل شيئا من هذا القبيل:

public class BaseClass : SomeOtherBase 
{
   public BaseClass() {}

   protected virtual void Setup()
   {
   }
}

public BaseClassProxy : BaseClass
{
   bool _fakeOut;
   protected BaseClassProxy(bool fakeOut)
   {
        _fakeOut = fakeOut;
        Setup();
   }

   public override void Setup()
   {
       if(_fakeOut)
       {
            base.Setup();
       }
       //Your other constructor code
   }
} 

وعند إنشاء BaseClassProxy الاعتراض فإنه يحتاج إلى إنشاء مثيل من أنها الفئة الأساسية، لذلك تحتاج إلى استدعاء منشئ الفئة الأساسية، ما يمكنك دو هو اختيار اللي تبونه واحد للاتصال، مثل:

public BaseClassProxy (bool fakeOut) : base (10) {}

لاستدعاء منشئ الثاني بدلا من الأول

وأخشى أن لا قاعدة يدعو منشئ ليست الخيار.

وانتهى بي الأمر القيام بشيء من هذا القبيل:

public class BaseClassProxy : BaseClass 
{
   public BaseClass BaseClass { get; private set; }

   public virtual int MethodINeedToOverride(){}
   public virtual string PropertyINeedToOverride() { get; protected set; }
}

وهذا حصل لي حول بعض الممارسات السيئة من الفئة الأساسية.

والمنشئات العامة هي بطبيعتها. لا تستخدم منشئ واستخدام آخر للبناء وجعله private.so كنت إنشاء مثيل مع عدم وجود مكالمة paramtersand التي تعمل لبناء مثيل الكائن الخاص بك.

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

هنا هو منشئ صفي:

public MyClass();
{
   throw new Exception("Error: Must call constructor with parameters.");
}

حسنًا، لقد تم تحذيرك الآن من أنه قبيح.لا شكاوى من فضلك!

كنت أرغب في فرض الحد الأدنى من المعلمات على الأقل من المنشئ الرئيسي الخاص بي دون السماح للمنشئ الأساسي الموروث بدون أي معلمات.

أعتقد أيضًا أنه إذا قمت بإنشاء مُنشئ ولم تضع:base() بعد ذلك لن يتم استدعاء مُنشئ الفئة الأساسية. وإذا قمت بإنشاء مُنشئات لجميع العناصر الموجودة في الفئة الأساسية وقمت بتوفير نفس المعلمات الدقيقة لهم في الفئة الرئيسية، فلن يتم تمريرها.ولكن هذا يمكن أن يكون مملاً إذا كان لديك الكثير من المنشئين في الفئة الأساسية!

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