我试图让继承类要求更少的参数,并为超类计算'正确'的mising参数。 寻求有关如何执行此操作的帮助,而不使用工厂方法。
这是一个简化事情的示例代码。 Son(int)将根据int的值调用super(int,boolean)。
class Base {
...
public Base (int num, boolean boo2) { ...}
...
}
class Son extends Base {
...
public Son (int num) {
if (num > 17)
super(num, true);
else
super(num , false);
}
...
}
我还考虑过让Base成为一个接口,但这不允许我强制执行一些参数正确性检查。
感谢您的帮助。
答案 0 :(得分:6)
我不是百分百肯定,但这可行吗?
class Son extends Base {
...
public Son (int num) {
super(num, (num>17));
}
...
}
答案 1 :(得分:3)
super()调用必须是构造函数中的第一个语句。在这种情况下,您可以使用:
class Base {
public Son(int num) {
super(num, num > 17);
}
}
如果您需要做的计算工作比单个表达式长,您可以将它移动到从构造函数调用的静态方法中:
class Son extends Base {
public Son(int num) {
super(num, calcBoo(num));
}
private static boolean calcBoo(int num) {
if (num > 17)
return true;
else
return false;
}
}
另一种选择是隐藏构造函数并添加一个静态工厂方法,这样可以在调用超级构造函数之前执行任意复杂的工作:
class Son extends Base {
private Son(int num, boolean boo) {
super(num, boo);
}
public static Son create(int num) {
boolean boo;
// ... statements here ... //
return new Son(num, boo);
}
}
答案 2 :(得分:3)
如果找到其他参数是一个复杂的操作(即,不能简化为单个表达式),您可以添加一个静态方法,为您执行此操作并在超级调用中引用它,如:
Class Son extends Base {
private static boolean getMyBoolean(int num) {
return num > 17; //or any complex algorithm you need.
}
public Son (int num) {
super(num, getMyBoolean(num));
}
...
}
否则,如果可以使用简单表达式计算缺少的参数(如您给出的具体示例),只需写:
Class Son extends Base {
public Son (int num) {
super(num, num > 17);
}
...
}
答案 3 :(得分:1)
请注意,构造函数调用必须是构造函数中的第一个语句。所以你需要:
public Son (int num) {
super(num, (num>17));
}
这将做同样的事情,因为num > 17
将被评估为true
或false
,它是构造函数中的第一个语句,因此它将被编译。
请参阅docs:
调用超类构造函数必须是第一行 子类构造函数。
答案 4 :(得分:1)
构造函数中的第一行必须是对super的调用,否则你就无法拥有它。
为什么不把行为推到Base类?无论如何,这将是解决这个问题的更好方法。
所以你会有类似的东西:
Son {
super(num,17); //in base, you have a "break point" parameter
....
}
答案 5 :(得分:1)
来自JLS §8.8.7:
构造函数体的第一个语句可能是对同一个类或直接超类(§8.8.7.1)的另一个构造函数的显式调用。
ConstructorBody: { ExplicitConstructorInvocationopt BlockStatementsopt }
对super()
的调用必须是构造函数的第一个语句。幸运的是,在你的情况下,有一种简单的方法来浓缩它,正如已经提到的那样:
public Son(int num) {
super(num, num > 17);
}
答案 6 :(得分:0)
我假设您要求调用super是构造函数中的第一行。
你可以像其他答案一样使用一个简单的布尔表达式,或者你可以推广解决方案(如果你的例子只是一个例子),并使用一个返回正确值的内联函数调用。您也可以查看三元运算符。