How to declare constructors in base classes so that sub-classes can use them without declaring them?
我希望子类使用其父类的构造函数。但似乎我总是需要在子类中再次定义它们,以便能够工作,如:
1 2 3 | public SubClass(int x, int y) : base (x, y) { //no code here } |
所以我想知道我是否没有在父类中正确地声明构造函数,或者根本没有直接的构造函数继承?
你没有做错什么。
在C中,实例构造函数不会被继承,因此在继承类型上声明它们并链接到基构造函数是正确的方法。
根据规范第1.6.7.1条:
Unlike other members, instance constructors are not inherited, and a class has no instance constructors other than those actually declared in the class. If no instance constructor is supplied for a class, then an empty one with no parameters is automatically provided.
我知道这并不能直接回答您的问题;但是,如果大多数构造函数只是在前面的构造函数中引入一个新参数,那么您可以利用可选参数(在C 4中引入)来减少需要定义的构造函数的数量。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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) { } } |
上述内容可简化为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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) { } } |
它仍然允许您用任意数量的参数初始化
构造函数不是从基类继承到派生的。每个构造函数必须首先调用基类ctor。编译器只知道如何调用无参数ctor。如果基类中没有此类ctor,则必须手动调用它。
So I'm wondering if I'm not declaring the constructor properly in the
parent class, because this seems silly.
如果基类没有默认构造函数,则必须在子类中重新声明它。这就是OOP在.NET中的工作方式。