繁体   English   中英

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

[英]java subclass: multiple constructors inherited from abstract superclass

基本上,我有:

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个类),如果你想要它总是被调用,只有一个构造函数。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM