c# सी#में बेस कन्स्ट्रक्टर को कॉल करना




constructor (7)

यदि मैं बेस क्लास से उत्तराधिकारी हूं और विरासत वर्ग के निर्माता से बेस क्लास के निर्माता को कुछ पास करना चाहता हूं, तो मैं यह कैसे कर सकता हूं?

उदाहरण के लिए,

अगर मैं अपवाद वर्ग से उत्तराधिकारी हूं तो मैं ऐसा कुछ करना चाहता हूं:

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

असल में जो मैं चाहता हूं वह बेस अपवाद वर्ग को स्ट्रिंग संदेश पास करने में सक्षम होना है।

https://code.i-harness.com


अपने कन्स्ट्रक्टर को निम्न में संशोधित करें ताकि वह बेस क्लास कन्स्ट्रक्टर को सही तरीके से कॉल कर सके:

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

ध्यान दें कि एक कन्स्ट्रक्टर ऐसा कुछ नहीं है जिसे आप किसी विधि के भीतर कभी भी कॉल कर सकते हैं। यही कारण है कि आपको कन्स्ट्रक्टर बॉडी में आपकी कॉल में त्रुटियां मिल रही हैं।


आप एक सशर्त चेक भी कर सकते हैं और कन्स्ट्रक्टर में गुणों में गुजर सकते हैं, जो कुछ लचीलापन की अनुमति देता है।

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

या

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

यदि आपको बेस कन्स्ट्रक्टर को कॉल करने की आवश्यकता है लेकिन तुरंत नहीं, क्योंकि आपकी नई (व्युत्पन्न) कक्षा को कुछ डेटा मैनिपुलेशन करने की आवश्यकता है, तो सबसे अच्छा समाधान फैक्ट्री विधि का सहारा लेना है। आपको अपने व्युत्पन्न कन्स्ट्रक्टर को निजी रूप से चिह्नित करना है, फिर अपनी कक्षा में एक स्थिर विधि बनाएं जो सभी आवश्यक सामग्री करेगी और बाद में कन्स्ट्रक्टर को कॉल करेगी और ऑब्जेक्ट को वापस कर देगी।

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

यहां सूचीबद्ध कुछ अन्य उत्तरों के अनुसार, आप बेस क्लास कन्स्ट्रक्टर में पैरामीटर पास कर सकते हैं। यह सलाह दी जाती है कि आप अपने विरासत वर्ग के लिए कन्स्ट्रक्टर की शुरुआत में अपने बेस क्लास कन्स्ट्रक्टर को कॉल करें।

public class MyException : Exception
{
    public MyException(string message, string extraInfo) : base(message)
    {
        this.Message = $"{message} Extra info: {extraInfo}";
        // You can omit the 'this.' portion above...
    }
}

मुझे लगता है कि आपके उदाहरण में आपने कभी भी अतिरिक्त extraInfo पैरामीटर का उपयोग नहीं किया है, इसलिए मुझे लगता है कि आप अपने अपवाद की Message संपत्ति में extraInfo स्ट्रिंग पैरामीटर को जोड़ना चाहते हैं (ऐसा लगता है कि इसे स्वीकृत उत्तर और कोड में अनदेखा किया जा रहा है आपका प्रश्न)।

यह केवल बेस क्लास कन्स्ट्रक्टर का आह्वान करके और फिर अतिरिक्त जानकारी के साथ संदेश संपत्ति को अपडेट करके हासिल किया जाता है।

वैकल्पिक रूप से, क्योंकि Message संपत्ति को बेस क्लास से विरासत में मिला है, आपको बेस क्लास कन्स्ट्रक्टर को स्पष्ट रूप से कॉल करने की भी आवश्यकता नहीं है। आप सीधे अपनी विरासत कक्षा के निर्माता से Message संपत्ति को अपडेट कर सकते हैं, जैसे:

public class MyException : Exception
{
    public MyException(string message, string extraInfo)
    {
        this.Message = $"{message} Extra info: {extraInfo}";
        // You can omit the 'this.' portion above...
    }
}

फ्रेमवर्क डिजाइन दिशानिर्देशों और FxCop नियमों से। :

1. कस्टम अपवाद का नाम होना चाहिए जो अपवाद के साथ समाप्त होता है

    class MyException : Exception

2. अपवाद सार्वजनिक होना चाहिए

    public class MyException : Exception

3. सीए 1032: अपवाद मानक कन्स्ट्रक्टर लागू करना चाहिए।

  • एक सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर।
  • एक स्ट्रिंग तर्क के साथ एक सार्वजनिक कन्स्ट्रक्टर।
  • एक स्ट्रिंग और अपवाद के साथ एक सार्वजनिक कन्स्ट्रक्टर (क्योंकि यह एक और अपवाद लपेट सकता है)।
  • यदि कोई प्रकार सील कर दिया गया है तो टाइप को सील नहीं किया गया है और निजी होने पर एक सीरियलाइजेशन कन्स्ट्रक्टर सुरक्षित है। एमएसडीएन के आधार पर:

    [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