请教一下C#中父类静态构造函数在子类中为啥不会和子类的静态构造函数一起执行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教一下C#中父类静态构造函数在子类中为啥不会和子类的静态构造函数一起执行相关的知识,希望对你有一定的参考价值。

请教一下C#中父类静态构造函数在子类中为什么不会和子类的静态构造函数一起执行。

如果子类有自己的构造函数,那么父类的构造函数就不会运行了。当子类没有构造函数时才会调用父类的构造函数来构造对象。 参考技术A 你应该去看一下继承这一块的东西 参考技术B 推荐你看一段视屏教程http://www.enet.com.cn/eschool/video/c/

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

【中文标题】如何为父类构造函数提供值,其中父构造函数的参数比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#中父类静态构造函数在子类中为啥不会和子类的静态构造函数一起执行的主要内容,如果未能解决你的问题,请参考以下文章

super关键字

java中,当实例化子类时会递归调用父类中的构造方法。这个说法对么?为啥

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

C#类的初始化顺序

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

Java 中父类怎么调用子类的方法?