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

时间:2011-10-24 10:31:13

标签: c# inheritance constructor

我还在学习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 = "";
}

???

3 个答案:

答案 0 :(得分:6)

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

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

    }

或者您可以将默认构造函数添加到基类...

答案 1 :(得分:5)

你可以在子类中使用一个参数较少的构造函数,但你需要调用base或同一类的参数化构造函数,如此

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

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

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

答案 2 :(得分:2)

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

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