سؤال

إذا كنت ترث من قاعدة فئة تريد تمرير شيء من منشئ ورثت فئة إلى منشئ الفئة الأساسية, كيف أفعل ذلك ؟

على سبيل المثال ،

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

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
    }
}

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

نصائح أخرى

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

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;
     }
}

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

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);
    }
}

صحيح استخدام 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
public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

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

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

1.مخصص استثناء يجب أن يكون الاسم الذي ينتهي مع استثناء

    class MyException : Exception

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

    public class MyException : Exception

3. CA1032:استثناء يجب أن يطبق المعيار المنشئات.

  • العامة parameterless منشئ.
  • العامة منشئ مع سلسلة واحدة الحجة.
  • العامة منشئ مع سلسلة واحدة و استثناء (كما يمكن لف استثناء آخر).
  • وهو منشئ التسلسل المحمية إذا كان نوع غير مختومة و خاصة إذا كان من النوع غير مختومة.على أساس 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.
      }
    }  

يمكنك أيضا القيام المشروط تحقق مع المعلمات في منشئ ، والذي يسمح ببعض المرونة.

public MyClass(object myObject=null): base(myObject ?? new myOtherObject())
{
}

أو

public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}
class Exception
{
     public Exception(string message)
     {
         [...]
     }
}

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

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

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

لقد لاحظ أنه في المثال الخاص بك يمكنك أبدا استخدام extraInfo المعلمة لذلك ظننت أنك قد ترغب لسلسلة extraInfo سلسلة المعلمة إلى Message مكان الإقامة استثناء (يبدو أن هذا يجري تجاهلها في الإجابة المقبولة و الرمز في السؤال).

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

public class MyException: Exception
{
    public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}")
    {
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top