基本上,我有:
public abstract class AbstractClass {
public AbstractClass( Type arg0, Type arg1, Type arg2 ) {
// do some stuff with all those args
}
public AbstractClass( Type onlyOneArg ) {
// do different stuffs with this different arg.
}
protected someMethods() { /* ... */ }
}
我在子类中遇到了一些问题:
我当前子类的示例:
public class MyClass extends AbstractClass {
public MyClass( Type arg0, Type arg1, Type arg2 ) {
super( arg0, arg1, arg2 );
}
public MyClass( Type onlyOneArg ) {
super( onlyOneArg );
}
}
和
我能为此做些什么吗? 有什么我不了解的Java吗?还是我的设计不好?或者......?
答案 0 :(得分:1)
子类必须调用超类构造函数中的一个(或两者,如果你重新定义两个,如你的例子);但你不能强迫它重新定义具有相同超类类签名的构造函数。
保证超类构造函数被称为的唯一方法是在超类中只有一个构造函数。
我认为你应该想办法重新设计你的超类(可能创建2个类),只有一个构造函数,如果你想要总是被调用。
但是,如果想要在子类中存在特定的构造函数,则应该在工厂中隔离“构造”问题;您可以在其中为每个子类设置特殊工厂类。您的工厂将实现此接口:
interface AbstractClassFactory {
AbstractClass create( Type arg0, Type arg1, Type arg2 );
AbstractClass create( Type onlyOneArg );
}
答案 1 :(得分:0)
构造函数不是在Java中继承的。这有时候可能很烦人,但就是这样。 我不明白,为什么你希望每个子类都实现两个构造函数。你写“在程序中,我用两个构造函数实例化,而不知道确切的类型”。你是什么意思?您无法实例化抽象类,您需要知道由“new”实例化的具体类型。如果使用反射,则可以在运行时检查可用的构造函数。