如何为父类构造函数提供值,其中父构造函数比c#中的static void main中的子类具有更多的参数?

时间:2019-04-14 02:07:08

标签: c# inheritance properties

我有一个父类Customer,该类有3个properties **

  

CID,Bal,Cname

**
我有一个具有1个属性Stats的子类。现在,我想通过静态void main将值从子类构造函数提供给父类constructor
我想为父类构造函数提供值仅来自基类。 我的代码在

   static void Main(string[] args)
        {
            Stat s1 = new Stat(false);//want to provide value to base class constructor from here only.
        }
    }

    class Customer
    {
        int _Cid, _Bal;

        string _Cname;

        public int CID
        {
            get
            {
                return _Cid;
            }
            set
            {
                _Cid= value;
            }
        }

        public int Bal
        {
            get
            {
                return _Bal;
            }
            set
            {
                _Bal = value;
            }
        }
        public string Cname
        {
            get
            {
                return _Cname;
            }
            set
            {
                _Cname = value;
            }
        }

        public Customer(int _Cid,int _Bal,String _Cname)
        {
            this._Cid=_Cid;
            this._Cname = _Cname;
            this._Bal = _Bal;
        }
    }


    class Stat:Customer
    {
        bool _Status;

        public bool Stats
            {
            get
            {
                return _Status;
            }
            set
            {
                _Status= value;
            }
    }
        public void display()
        {
        }
        public Stat(bool _Status):base(int _Cid, int _Bal, String _Cname) //child class constructor how can i supply value to parent class constructor.
        {
            this._Status = _Status;
        }
    }

1 个答案:

答案 0 :(得分:2)

您的基类构造函数是这个:

public Customer(int _Cid,int _Bal,String _Cname)

您派生的类构造函数是这个:

public Stat(bool _Status)

在C#中,当实例化派生类时,必须调用基类。在基类只有一个无参数构造函数的情况下,这是在派生类构造函数主体执行之前隐式完成的。如果基类没有无参数的构造函数,则必须使用base显式调用它。

以这个例子为例:

public enum MyEnum
{
    Person,
    Animal,
    Derived
}

public class Base
{
    public Base(MyEnum classType)
    {
    }
}

public class Person : Base
{

}

有两种方法可以执行此操作:接受Person的参数并将其传递给基本构造函数:

public class Person : Base
{
    public Person(MyEnum classType) : base(classType)
    {
        // this will be executed after the base constructor completes
    }
}

或通过对值进行硬编码(假设MyEnum包含值Person):

public class Person : Base
{
    public Person() : base(MyEnum.Person)
    {
        // this will be executed after the base constructor completes
    }
}

请注意,您可以具有多个构造函数,因此,如果派生类使用某些默认值实例化值,则可以定义另一个protected构造函数以供派生类使用。 protected确保只能由派生类调用,而不能由任何调用new Base(...)的人调用:

public class Base
{
    private readonly MyEnum _classType;

    public Base(MyEnum classType)
    {
        _classType = classType;
    }

    protected Base()
    {
        _classType = classType.Derived;
    }
}

public class Person : Base
{
    public Person() : base()
    {
        // this will be executed after the base constructor completes
    }        
}

基类和派生类中的参数数量之间没有关系。仅存在一个简单的要求:派生构造函数必须调用(并满足任何参数要求)其基类构造函数,其中基类构造函数接受参数,或者有多个。

在您的特定示例中,您可能打算这样做:

public Stat(bool _Status, int _Cid, int _Bal, String _Cname) : base(_Cid, _Bal, _Cname)

请注意,命名参数_Cid有点奇怪。前缀_通常表示它是类中的私有字段。普通的C#约定对方法参数使用驼峰式(camelCaseArgumentName)。