c# दूसरे से एक कन्स्ट्रक्टर को कॉल करें




constructor (6)

मेरे पास दो रचनाकार हैं जो केवल पढ़ने के लिए मूल्यों को फ़ीड करते हैं।

class Sample
{
    public Sample(string theIntAsString)
    {
        int i = int.Parse(theIntAsString);

        _intField = i;
    }

    public Sample(int theInt)
    {
        _intField = theInt;
    }


    public int IntProperty
    {
        get { return _intField; }
    }
    private readonly int _intField;

}

एक कन्स्ट्रक्टर सीधे मान प्राप्त करता है, और दूसरा कुछ गणना करता है और मान प्राप्त करता है, फिर फ़ील्ड सेट करता है।

अब पकड़ है:

  1. मैं सेटिंग कोड डुप्लिकेट नहीं करना चाहता हूं। इस मामले में, केवल एक फ़ील्ड सेट है लेकिन निश्चित रूप से एक से अधिक हो सकता है।
  2. फ़ील्ड को केवल पढ़ने के लिए, मुझे उन्हें कन्स्ट्रक्टर से सेट करने की आवश्यकता है, इसलिए मैं साझा कोड को एक उपयोगिता फ़ंक्शन में "निकालने" नहीं कर सकता।
  3. मुझे नहीं पता कि एक कन्स्ट्रक्टर को दूसरे से कैसे कॉल करें।

कोई विचार?


इस कदर:

public Sample(string str) : this(int.Parse(str)) {
}

मैं सुपरकैट के जवाब पर सुधार कर रहा हूं। मुझे लगता है कि निम्नलिखित भी किया जा सकता है:

class Sample
{
    private readonly int _intField;
    public int IntProperty
    {
        get { return _intField; }
    }

    void setupStuff(ref int intField, int newValue)
    {
        //Do some stuff here based upon the necessary initialized variables.
        intField = newValue;
    }

    public Sample(string theIntAsString, bool? doStuff = true)
    {
        //Initialization of some necessary variables.
        //==========================================
        int i = int.Parse(theIntAsString);
        // ................
        // .......................
        //==========================================

        if (!doStuff.HasValue || doStuff.Value == true)
           setupStuff(ref _intField,i);
    }

    public Sample(int theInt): this(theInt, false) //"false" param to avoid setupStuff() being called two times
    {
        setupStuff(ref _intField, theInt);
    }
}

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

class Sample
{
    private readonly int _intField;
    public int IntProperty
    {
        get { return _intField; }
    }

    void setupStuff(ref int intField, int newValue)
    {
        intField = newValue;
    }

    public Sample(string theIntAsString)
    {
        int i = int.Parse(theIntAsString);
        setupStuff(ref _intField,i);
    }

    public Sample(int theInt)
    {
        setupStuff(ref _intField, theInt);
    }
}

हाँ, आप कॉल बेस या इससे पहले अन्य विधि को कॉल कर सकते हैं!

public class MyException : Exception
{
    public MyException(int number) : base(ConvertToString(number)) 
    {
    }

    private static string ConvertToString(int number) 
    { 
      return number.toString()
    }

}

यहां एक उदाहरण दिया गया है जो एक और कन्स्ट्रक्टर को कॉल करता है, फिर उसके द्वारा सेट की गई संपत्ति पर जांच करता है।

    public SomeClass(int i)
    {
        I = i;
    }

    public SomeClass(SomeOtherClass soc)
        : this(soc.J)
    {
        if (I==0)
        {
            I = DoSomethingHere();
        }
    }

जब आप बेस क्लास से कक्षा प्राप्त करते हैं, तो आप व्युत्पन्न कक्षा को तुरंत चालू करके बेस क्लास कन्स्ट्रक्टर का आह्वान कर सकते हैं

class samle {
    public int x;

    public sample(int value) {
        x = value;
    }
}

class der : public sample {
    public:
        int a;
        int b;

        public der(int value1,int value2) : base(50) {
            a = value1;
            b = value2;
        }

        class run {
            public static void main(String[] args){
                der obj = new der(10,20);
                Console.WriteLine(obj.x);
                Console.WriteLine(obj.a);
                Console.WriteLine(obj.b);
            }
        }

कार्यक्रम का आउटपुट है

50 10 20

आप इस कीवर्ड का उपयोग किसी अन्य निर्माता से कन्स्ट्रक्टर का आह्वान भी कर सकते हैं

class samle {
    public int x;

    public sample(int value) {
        x = value;
    }

    public sample(sample obj):this(obj.x) {
    }
}

class run{
    public static void main(String[] args) {
        sample s = new sample(20);
        sample ss = new sample(s);
        Console.WriteLine(ss.x);
    }
}

आउटपुट 20 है।







constructor