c# - شرح - constructor java




استدعاء منشئ واحد من آخر (5)

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

أيه أفكار؟


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

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

إذا كان ما تريده لا يمكن تحقيقه بشكل مرضٍ دون الحاجة إلى التهيئة بطريقته الخاصة (على سبيل المثال ، لأنك تريد القيام بالكثير قبل رمز التهيئة ، أو لفه في محاولة أخيرة ، أو أيًا كان) ، فيمكنك الحصول على أي شيء أو كل الصياغه تمرير المتغيرات 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);
    }
}

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

: base (parameters)

: this (parameters)

مثال:

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

مثله:

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

هنا مثال يستدعي منشئ آخر ، ثم يتحقق من الخاصية التي قام بتعيينها.

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

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






constructor