我希望子类使用其父类的构造函数。但似乎我总是需要在子类中再次定义它们才能使它起作用,如下所示:
public SubClass(int x, int y) : base (x, y) {
//no code here
}
所以我想知道我是不是在父类中正确地声明了构造函数,或者根本没有直接的构造函数继承?
答案 0 :(得分:9)
你没有做错任何事。
在C#中,实例构造函数不会被继承,因此在继承类型上声明它们并链接到基础构造函数是正确的方法。
来自规范§1.6.7.1:
与其他成员不同,实例构造函数不是继承的,并且除了在类中实际声明的实例之外,没有实例构造函数。如果没有为类提供实例构造函数,则会自动提供没有参数的空构造函数。
答案 1 :(得分:4)
我知道这并没有直接回答你的问题;但是,如果您的大多数构造函数只是在前一个构造函数上引入了一个新参数,那么您可以利用可选参数(在C#4中引入)来减少需要定义的构造函数的数量。
例如:
public class BaseClass
{
private int x;
private int y;
public BaseClass()
: this(0, 0)
{ }
public BaseClass(int x)
: this(x, 0)
{ }
public BaseClass(int x, int y)
{
this.x = x;
this.y = y;
}
}
public class DerivedClass : BaseClass
{
public DerivedClass()
: base()
{ }
public DerivedClass(int x)
: base(x)
{ }
public DerivedClass(int x, int y)
: base(x, y)
{ }
}
以上可以简化为:
public class BaseClass
{
private int x;
private int y;
public BaseClass(int x = 0, int y = 0)
{
this.x = x;
this.y = y;
}
}
public class DerivedClass : BaseClass
{
public DerivedClass(int x = 0, int y = 0)
: base(x, y)
{ }
}
它仍然允许您使用任意数量的参数初始化BaseClass
和DerivedClass
:
var d1 = new DerivedClass();
var d2 = new DerivedClass(42);
var d3 = new DerivedClass(42, 43);
答案 2 :(得分:3)
构造函数不是从基类继承到派生的。每个构造函数必须首先调用基类ctor。编译器只知道如何调用无参数ctor。如果基类中没有这样的ctor,则必须手动调用它。
答案 3 :(得分:1)
所以我想知道我是不是在正确地声明构造函数 父类,因为这看起来很傻。
如果基类没有默认构造函数,则必须在子类中重新声明它。这就是OOP在.NET中的工作方式。