c# شرح - استدعاء منشئ واحد من آخر




constructor java (7)

لدي اثنين من الصانعين التي تغذي القيم إلى الحقول readonly.

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. لا أعرف كيف أتصل بمنشئ واحد من آخر.

أيه أفكار؟


Answers

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

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

عندما ترث فئة من فئة أساسية ، يمكنك استدعاء منشئ الفئة الأساسي عن طريق instantiating فئة المشتقة

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.


نعم ، يمكنك استدعاء طريقة أخرى قبل قاعدة الاتصال أو هذا!

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

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

}

أنا أتحسن على إجابة سوبيركات. أعتقد أن ما يلي يمكن القيام به أيضًا:

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

مثله:

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

قبل نص المنشئ ، استخدم إما:

: base (parameters)

: this (parameters)

مثال:

public class People: User
{
   public People (int EmpID) : base (EmpID)
   {
      // Add more statements here.
   }
}

داخل مُنشئ ، يمكنك استخدام this الكلمة الأساسية لاستدعاء منشئ آخر في نفس الفئة. يسمى القيام بذلك استدعاء صريح منشئ .

فيما يلي فئة مستطيل أخرى ، مع تطبيق مختلف عن ذلك الموجود في قسم الكائنات.

public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(1, 1);
    }
    public Rectangle(int width, int height) {
        this( 0,0,width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

}

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







c# constructor