在子类上创建默认构造函数

本文关键字:默认 构造函数 创建 子类 | 更新日期: 2023-09-27 18:12:05

我还在学习c#,只是有一个关于继承的基本问题。

假设我有一个抽象类SportsPlayer:

public abstract class SportsPlayer
{
    string name;    /*1ai*/
    int age;        /*1aii*/
    Sexs gender;    /*1aiii*/ 
    //1b
    public SportsPlayer(string n, int a, Sexs g)
    {
        this.name = n;
        this.age = a;
        this.gender = g;
    }
}

和一个子类SoccerPlayer:

public class SoccerPlayer : SportsPlayer
    {
        Positions position;
        public SoccerPlayer(string n, int a, Sexs g, Positions p)
            : base(n, a, g)
        {
            this.position = p;
        }
        //Default constructor
        public SoccerPlayer()
        {
        }

是否有可能在没有传递参数的子类上创建构造函数,或者我是否认为为了在子类上创建默认构造函数,超类也必须有默认构造函数?


另外,如果要向超类添加默认构造函数,如何在子类构造函数中初始化超类变量?在java中是super(),在c#中是??

public SoccerPlayer():base()
{
    base.name = "";
}

? ?

在子类上创建默认构造函数

您可以在派生类上创建无参数构造函数,但它仍然需要向基类构造函数传递参数:

    //Default constructor
    public SoccerPlayer()
        : base("default name", 0, default(Sexs))
    {
    }

你可以在子类中使用无参数构造函数但是你需要调用基类或相同类的参数化构造函数,就像这样

public Child():base(1,2,3)
{
}

public Child(): this(1,2,3)
{
}

在你的情况下,这没有多大意义。足球运动员不能有默认的姓名或年龄。

您可以创建新的构造函数,但是如果您不调用base(...),则基类中的某些东西无法初始化。
所以你应该使用:

public SoccerPlayer()
    :base("name", 30, Sexs.???)
{
}