如何停止强制子 类 实现父构造函数
How to stop enforcing child classes to implement parent constructor
让我们考虑以下 class :
public abstract class Parent{
protected Parent(Object object){
/* ... */
}
}
还有下一个:
public final class Child1 extends Parent{
public Child1(Object object){
super(object);
}
}
是否有任何通用的方法来停止在 classes 扩展父 class 中强制执行调用 super(object)
的构造函数,以便始终调用父构造函数?
我想知道,因为我将有一堆 classes 扩展 Parent 并且它们都将共享相同的构造函数,没有特别的例外,所以我会节省时间(不是这么多,但我也只是好奇)。
A child class 总是 必须调用其 parent 的构造函数之一。
即使 parent class 中的 no-arg 构造函数也是如此:
class Parent {
Parent() {}
}
class Child extends Parent {
Child() {}
}
编译器将在 child 的构造函数中插入一个调用:
class Child extends Parent {
Child() {
super();
}
}
如果 Parent
class' 构造函数都需要参数,编译器不能假设它可以通过 Child
构造函数参数:
class Child extends Parent {
Child(Object first, Object second) {
super(???); // Which of the parameters do you pass here?
}
}
即使在只有一个 Child
构造函数参数的情况下,编译器也无法知道您是否真的想传递那个参数 as-is,或者您是否真的打算传递从它(甚至不是):
Child(Object first) {
super(first);
}
Child(Object first) {
super(first + "");
}
Child(Object first) {
super("Hello world");
first.doThing();
}
这些(以及更多)中的每一个都是同样有效的选择。
编译器不知道你想要什么,所以你必须明确地告诉它。对不起,没办法。
让我们考虑以下 class :
public abstract class Parent{
protected Parent(Object object){
/* ... */
}
}
还有下一个:
public final class Child1 extends Parent{
public Child1(Object object){
super(object);
}
}
是否有任何通用的方法来停止在 classes 扩展父 class 中强制执行调用 super(object)
的构造函数,以便始终调用父构造函数?
我想知道,因为我将有一堆 classes 扩展 Parent 并且它们都将共享相同的构造函数,没有特别的例外,所以我会节省时间(不是这么多,但我也只是好奇)。
A child class 总是 必须调用其 parent 的构造函数之一。
即使 parent class 中的 no-arg 构造函数也是如此:
class Parent {
Parent() {}
}
class Child extends Parent {
Child() {}
}
编译器将在 child 的构造函数中插入一个调用:
class Child extends Parent {
Child() {
super();
}
}
如果 Parent
class' 构造函数都需要参数,编译器不能假设它可以通过 Child
构造函数参数:
class Child extends Parent {
Child(Object first, Object second) {
super(???); // Which of the parameters do you pass here?
}
}
即使在只有一个 Child
构造函数参数的情况下,编译器也无法知道您是否真的想传递那个参数 as-is,或者您是否真的打算传递从它(甚至不是):
Child(Object first) {
super(first);
}
Child(Object first) {
super(first + "");
}
Child(Object first) {
super("Hello world");
first.doThing();
}
这些(以及更多)中的每一个都是同样有效的选择。
编译器不知道你想要什么,所以你必须明确地告诉它。对不起,没办法。