java子类:从抽象超类继承的多个构造函数

时间:2012-04-02 03:26:49

标签: java inheritance constructor abstract-class

基本上,我有:

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吗?还是我的设计不好?或者......?

2 个答案:

答案 0 :(得分:1)

子类必须调用超类构造函数中的一个(或两者,如果你重新定义两个,如你的例子);但你不能强迫它重新定义具有相同超类类签名的构造函数。

保证超类构造函数被称为的唯一方法是在超类中只有一个构造函数。

我认为你应该想办法重新设计你的超类(可能创建2个类),只有一个构造函数,如果你想要总是被调用。

但是,如果想要在子类中存在特定的构造函数,则应该在工厂中隔离“构造”问题;您可以在其中为每个子类设置特殊工厂类。您的工厂将实现此接口:

interface AbstractClassFactory {
  AbstractClass create( Type arg0, Type arg1, Type arg2 );
  AbstractClass create( Type onlyOneArg );
}

答案 1 :(得分:0)

构造函数不是在Java中继承的。这有时候可能很烦人,但就是这样。 我不明白,为什么你希望每个子类都实现两个构造函数。你写“在程序中,我用两个构造函数实例化,而不知道确切的类型”。你是什​​么意思?您无法实例化抽象类,您需要知道由“new”实例化的具体类型。如果使用反射,则可以在运行时检查可用的构造函数。