我还在学习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 = "";
}
???
答案 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.???)
{
}