في C#، هل تحتاج إلى استدعاء المُنشئ الأساسي؟

StackOverflow https://stackoverflow.com/questions/18097

  •  09-06-2019
  •  | 
  •  

سؤال

في لغة C#، إذا كان لدي فئة موروثة ذات مُنشئ افتراضي، فهل يجب علي استدعاء مُنشئ الفئة الأساسية بشكل صريح أم سيتم استدعاؤها ضمنيًا؟

class BaseClass
{
    public BaseClass()
    {
        // ... some code
    }
}
class MyClass : BaseClass
{
    public MyClass() // Do I need to put ": base()" here or is it implied?
    {
        // ... some code
    }
}
هل كانت مفيدة؟

المحلول

لا تحتاج إلى استدعاء المُنشئ الأساسي بشكل صريح، فسيتم استدعاؤه ضمنيًا.

قم بتوسيع مثالك قليلاً وإنشاء تطبيق وحدة تحكم ويمكنك التحقق من هذا السلوك بنفسك:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass foo = new MyClass();

            Console.ReadLine();
        }
    }

    class BaseClass
    {
        public BaseClass()
        {
            Console.WriteLine("BaseClass constructor called.");
        }
    }

    class MyClass : BaseClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass constructor called.");
        }
    }
}

نصائح أخرى

وهو ضمني، بشرط أن يكون بلا معلمة.هذا لأنك بحاجة إلى تنفيذ المنشئات التي تأخذ القيم, ، راجع الكود أدناه للحصول على مثال:

public class SuperClassEmptyCtor
{
    public SuperClassEmptyCtor()
    {
        // Default Ctor
    }
}

public class SubClassA : SuperClassEmptyCtor
{
    // No Ctor's this is fine since we have
    // a default (empty ctor in the base)
}

public class SuperClassCtor
{
    public SuperClassCtor(string value)
    {
        // Default Ctor
    }
}

public class SubClassB : SuperClassCtor
{
    // This fails because we need to satisfy
    // the ctor for the base class.
}

public class SubClassC : SuperClassCtor
{
    public SubClassC(string value) : base(value)
    {
        // make it easy and pipe the params
        // straight to the base!
    }
}

إنه مضمن للمنشئات الأساسية بدون معلمات، ولكنه ضروري للإعدادات الافتراضية في الفصل الحالي:

public class BaseClass {
    protected string X;

    public BaseClass() {
        this.X = "Foo";
    }
}

public class MyClass : BaseClass
{
    public MyClass() 
        // no ref to base needed
    {
        // initialise stuff
        this.X = "bar";
    }

    public MyClass(int param1, string param2)
        :this() // This is needed to hit the parameterless ..ctor
    {
         // this.X will be "bar"
    }

    public MyClass(string param1, int param2)
        // :base() // can be implied
    {
         // this.X will be "foo"
    }
}

فهذا يعني ضمنا أنه.

يتم بناء فئة مشتقة على الفئة الأساسية.إذا فكرت في الأمر، يجب إنشاء مثيل للكائن الأساسي في الذاكرة قبل أن يتم إلحاق الفئة المشتقة به.لذلك سيتم إنشاء الكائن الأساسي في الطريق إلى إنشاء الكائن المشتق.لذلك لا، لا يمكنك استدعاء المنشئ.

AFAIK، ما عليك سوى الاتصال بالمنشئ الأساسي إذا كنت بحاجة إلى تمرير أي قيم إليه.

لا تحتاج إلى استدعاء المُنشئ الأساسي صراحةً، فسيتم استدعاؤه ضمنيًا، لكن في بعض الأحيان تحتاج إلى تمرير معلمات إلى المُنشئ، وفي هذه الحالة يمكنك القيام بشيء مثل:

using System;
namespace StackOverflow.Examples
{
    class Program
    {
        static void Main(string[] args)
        {
            NewClass foo = new NewClass("parameter1","parameter2");
            Console.WriteLine(foo.GetUpperParameter());
            Console.ReadKey();
        }
    }

    interface IClass
    {
        string GetUpperParameter();
    }

    class BaseClass : IClass
    {
        private string parameter;
        public BaseClass (string someParameter)
        {
            this.parameter = someParameter;
        }

        public string GetUpperParameter()
        {
            return this.parameter.ToUpper();
        }
    }

    class NewClass : IClass
    {
        private BaseClass internalClass;
        private string newParameter;

        public NewClass (string someParameter, string newParameter)
        {
            this.internalClass = new BaseClass(someParameter);
            this.newParameter = newParameter;
        }

        public string GetUpperParameter()
        {
            return this.internalClass.GetUpperParameter() + this.newParameter.ToUpper();
        }
    }
}

ملحوظة:إذا كان شخص ما يعرف حلا أفضل من فضلك يقول لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top