C#এ বেস কন্সট্রাকটর কলিং




constructor (7)

যদি আমি একটি বেস ক্লাস থেকে উত্তরাধিকারী এবং উত্তরাধিকারী ক্লাসের কন্সট্রকটর থেকে বেস ক্লাসের নির্মাতা থেকে কিছু পাস করতে চাই, তবে আমি তা কীভাবে করব?

উদাহরণ স্বরূপ,

আমি ব্যতিক্রম ক্লাস থেকে উত্তরাধিকারী হলে আমি এমন কিছু করতে চাই:

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

মূলত আমি যা চাই তা হল বেস ব্যতিক্রম ব্যতিক্রম ক্লাসে স্ট্রিং বার্তা প্রেরণ করতে সক্ষম।


আপনি কনস্ট্রাক্টারের পরামিতিগুলির সাথে একটি শর্তাধীন চেকও করতে পারেন, যা কিছু নমনীয়তা দেয়।

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 প্যারামিটারটি ব্যবহার করেননি, তাই আমি অনুমান করেছি যে আপনি extraInfo স্ট্রিং প্যারামিটারটি আপনার ব্যতিক্রমের Message সম্পত্তিটিতে extraInfo করতে চাইতে পারেন (মনে হচ্ছে এটি গৃহীত উত্তর এবং 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...
    }
}

এটি বেস বর্গ কন্সট্রাকটরকে কল করার জন্য 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

ফ্রেমওয়ার্ক ডিজাইন নির্দেশিকা এবং FxCop নিয়ম থেকে। :

1. কাস্টম ব্যতিক্রম একটি ব্যতিক্রম থাকা উচিত যে ব্যতিক্রম সঙ্গে শেষ

    class MyException : Exception

2. ব্যতিক্রম পাবলিক হতে হবে

    public class MyException : Exception

3. CA1032: ব্যতিক্রম স্ট্যান্ডার্ড কনস্ট্রাক্টর প্রয়োগ করা উচিত।

  • একটি পাবলিক পরামিতি নির্মাতা।
  • একটি স্ট্রিং যুক্তি সঙ্গে একটি পাবলিক কনস্ট্রাক্টর।
  • একটি স্ট্রিং এবং ব্যতিক্রমের সাথে একটি পাবলিক কন্সট্রকটার (এটি অন্য ব্যতিক্রম মোড়ানো করতে পারে)।
  • টাইপ সিল করা হয় না এবং টাইপ সিল করা হয় তাহলে ব্যক্তিগত একটি সিরিয়ালাইজেশন কনস্ট্রাকটর সুরক্ষিত। এমএসডিএন এর উপর ভিত্তি করে:

    [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