如何为父类构造函数提供值,其中父构造函数的参数多于c#中static static main的子类; [关闭]

问题描述 投票:-8回答:1

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

CID,巴尔,CNAME

** 我有一个子类,它有一个属性Stats.now我想通过static 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;
        }
    }
c# inheritance properties
1个回答
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#约定使用camel case(camelCaseArgumentName)作为方法参数。

© www.soinside.com 2019 - 2024. All rights reserved.