[注意:编写的代码仅用于显示问题,而不是因为它具有固有的用途。]
我们说我有两个班级A
和B
:
public class A {
public const int max = 2;
public int[] id;
public A() {
this.id = new int[A.max];
}
public A(int id) : this() {
this.id[0] = id;
}
public A(int id, int id2) : this() {
this.id[0] = id;
this.id[1] = id2;
}
}
public class B : A {
public B(int[] ids) : base() {
int x = 0;
while ( ( x < ids.Length ) && ( x < A.max ) ) {
this.id[x] = ids[x];
x++;
}
}
}
似乎通过在B
中创建新的构造函数,我无意中隐藏了通常会继承的所有构造函数&#34;来自B
的{{1}}(事实上,我已经了解到构造函数不会在C#中继承,但我仍然在这里感到困惑。)
例如:
A
如果我从A first = new A(); // fine
int[] x = new int[A.max-1];
B second = new B(x); // fine
B third = new B(12); // nope
删除新的构造函数,那么B
就可以正常工作(在我的术语中,构造函数不是&#34; t&#34;隐藏&#34;再也是)。但是使用B third = new B(12);
中的新构造函数,B
构造函数不再适用于我。
真的解决方案是否只需重新定义 ALL 我希望B从A继承并使其为空的构造函数?例如:
A(int)
如果我进行了更改,现在public class B : A {
public B(int id) : base(id) {} // adding this!
public B(int[] ids) : base() {
int x = 0;
while ( ( x < ids.Length ) && ( x < A.max ) ) {
this.id[x] = ids[x];
}
}
}
工作正常。但是,我必须重新定义我想要在派生类的基类中使用的每个构造函数,这似乎有点难看,只是因为我在这个派生类中添加了一个新的构造函数!
答案 0 :(得分:3)
是的,派生类不会从基类中获取或公开构造函数。您需要在基类中定义所有必需的构造函数(可能调用基类'构造函数)。
注意:如果你派生的类没有什么可以初始化的话,你可能想重新考虑一下你是否真的需要新的课程。
答案 1 :(得分:0)
我认为你是绝对正确的EleventyOne你的例子很笨重,但问题不在于你的设计语言。我知道你的例子不是一个现实世界的例子,因此抽象的问题会产生抽象的答案。
如果您发现自己的基类很多构造函数,那么您的设计是错误的。你可能试图在继承中建模更适合于组合的东西,或者你的基类应该接受一个对象而不是单独的相关属性,如果属性不相关那么你的基类可能做得太多了(单一责任原则)。
如果感觉不对,你会有代码味道! :)