شرح - استدعاء مُنشئ القاعدة في C#



constructor java (7)

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

public class MyClass : BaseClass
{
    private MyClass(string someString) : base(someString)
    {
        //your code goes in here
    }

    public static MyClass FactoryMethod(string someString)
    {
        //whatever you want to do with your string before passing it in
        return new MyClass(someString);
    }
}

https://code.i-harness.com

إذا كنت ترث من فئة أساسية وترغب في تمرير شيء من مُنشئ الفصل الموروث إلى مُنشئ الفصل الأساسي ، كيف أفعل ذلك؟

فمثلا،

إذا كنت أرث من فئة الاستثناء ، فأنا أريد أن أفعل شيئًا كالتالي:

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     {
         //This is where it's all falling apart
         base(message);
     }
}

أساسا ما أريده هو أن تكون قادرة على تمرير رسالة السلسلة إلى فئة استثناء قاعدة.


تعديل المُنشئ الخاص بك إلى التالي بحيث يستدعي منشئ الفئة الأساسية بشكل صحيح:

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message, string extrainfo) : base(message)
    {
        //other stuff here
    }
}

لاحظ أن المُنشئ ليس شيئًا يمكنك الاتصال به في أي وقت داخل إحدى الطرق. هذا هو السبب في أنك تحصل على أخطاء في مكالمتك في جسم المنشئ.


صحيح أن استخدام base (شيء) لاستدعاء منشئ الطبقة الأساسية ، ولكن في حالة الحمولة الزائدة استخدام this الكلمة

public ClassName() : this(par1,par2)
{
// do not call the constructor it is called in the this.
// the base key- word is used to call a inherited constructor   
} 

// Hint used overload as often as needed do not write the same code 2 or more times

لاحظ أنه يمكنك استخدام أساليب ثابتة داخل استدعاء مُنشئ القاعدة.

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo) : 
         base(ModifyMessage(message, extraInfo))
     {
     }

     private static string ModifyMessage(string message, string extraInfo)
     {
         Trace.WriteLine("message was " + message);
         return message.ToLowerInvariant() + Environment.NewLine + extraInfo;
     }
}

من المبادئ التوجيهية لتصميم الإطار وقواعد FxCop. :

1. يجب أن يكون للإستثناء المخصص اسم ينتهي بـ "استثناء"

    class MyException : Exception

2. يجب أن يكون الاستثناء العام

    public class MyException : Exception

3. CA1032: يجب أن يقوم استثناء بتنفيذ الصانعين القياسيين.

  • مُنشئ عام بلا معلمات.
  • مُنشئ عام بوسيطة سلسلة واحدة.
  • مُنشئ عام بسلسلة واحدة واستثناء (كما يمكن أن يؤدي إلى التفاف استثناء آخر).
  • يكون منشئ التسلسل محميًا إذا لم يكن النوع مغلقًا وخاصًا إذا كان النوع مغلقًا. على أساس MSDN :

    [Serializable()]
    public class MyException : Exception
    {
      public MyException()
      {
         // Add any type-specific logic, and supply the default message.
      }
    
      public MyException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public MyException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      protected MyException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
    }  
    

أو

    [Serializable()]
    public sealed class MyException : Exception
    {
      public MyException()
      {
         // Add any type-specific logic, and supply the default message.
      }

      public MyException(string message): base(message) 
      {
         // Add any type-specific logic.
      }
      public MyException(string message, Exception innerException): 
         base (message, innerException)
      {
         // Add any type-specific logic for inner exceptions.
      }
      private MyException(SerializationInfo info, 
         StreamingContext context) : base(info, context)
      {
         // Implement type-specific serialization constructor logic.
      }
    }  

class Exception
{
     public Exception(string message)
     {
         [...]
     }
}

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     : base(message)
     {
         [...]
     }
}

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

يمكنك تمرير استثناء داخلي إلى أحد الصانعين.





constructor