如何为父类构造函数提供值,其中父构造函数的参数比c#中静态void main的子类多? [关闭]

Posted

技术标签:

【中文标题】如何为父类构造函数提供值,其中父构造函数的参数比c#中静态void main的子类多? [关闭]【英文标题】:how to provide value to parent class constructor where parent constructor have more argument than child class from static void main in c#? [closed] 【发布时间】:2019-09-04 09:16:49 【问题描述】:

我有一个父类 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;
        
    

【问题讨论】:

您必须定义一个接受正确值的派生类构造函数,然后传递它们。 已经有@MarkBenningfield 不,你没有。发布的代码甚至无法编译。 是的,因为我不知道如何为父类构造函数@MarkBenningfield 提供值 见Instance Constructors (C# Programming Guide) 【参考方案1】:

你的基类构造函数是这样的:

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) 作为方法参数。

【讨论】:

一个小修正:当基类只有一个无参数构造函数时,它被隐式调用。如果它还有另一个构造函数,则必须在子类构造函数中显式调用其中一个。 @Zohar 好点。 :)

以上是关于如何为父类构造函数提供值,其中父构造函数的参数比c#中静态void main的子类多? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c# 子类如何调用父类的构造函数

子类为啥要调用父类的构造函数

Flutter 6种构造函数详解

子类都会首先调用父类的构造函数吗?

子父类中的构造函数

在java语言里如何在子类中调用父类的有参构造函数