2012-04-02 66 views
5

继承基本上,我有:java的子类:多个构造从抽象的超

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() { /* ... */ } 
} 

而且我在子类中的几个问题:

  • 首先,我要-in大部分案例 - 无用地重写构造函数。不是非常烦人,只是有点肮脏的眼睛。
  • 而且,更重要的是,我不是被迫执行这两个构造函数(虽然都在程序中使用)。我目前的子类的

例子:

public class MyClass extends AbstractClass { 
    public MyClass(Type arg0, Type arg1, Type arg2) { 
     super(arg0, arg1, arg2); 
    } 

    public MyClass(Type onlyOneArg) { 
     super(onlyOneArg); 
    } 
} 

而且

  • 我必须能够写一些特定的代码在子类的构造函数,如果我想要的。
  • 我有太多的共享代码,我想保留在抽象类中。

我可以做些什么吗? 有没有我不了解Java的东西?或者我的设计不好?要么.. ?

+1

不知道问题是什么。你想被迫实现所有的超类构造函数吗?你所说的要求是什么,你似乎无法做到? – 2012-04-02 03:45:32

+0

我很乐意重新提出这个问题,但我不太确定如何..我的意思是我想确保在每个AbstractClass的子类中都有构造函数可用。在程序中,我在不知道确切类型的情况下使用两个构造函数实例化。我只知道该对象将是一个'AbstractClass'子类。所以我必须确定我总是可以使用这两个构造函数。这更容易理解吗?...... Sry,很难用英语表达我的想法! – user978548 2012-04-02 03:54:10

+0

除此之外,我还想知道是否有可能以某种方式让java自动使用'AbstractClass'构造函数,如果它没有在子类中定义的话,但那不是我主要关心的。 – user978548 2012-04-02 03:56:54

回答

1

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

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

我认为你应该想办法重新设计你的超类(也许创建2类)只有一个构造函数,如果你想要它总是被调用。但是,如果想要在子类中存在特定的构造函数,则应该隔离工厂中的“构造”关注点;您可以在其中为每个子类设置特殊的工厂类。您的工厂将实现此接口:

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

只是有点相关的问题: 我刚刚在Eclipse中进行了测试,看到我可以将工厂接口嵌套在抽象类中,并且每个子类工厂嵌套在它们各自类中的嵌套类没有问题。 这是一个不好的做法? – user978548 2012-04-02 04:18:54

+0

@ user978548:不一定,它可能会混淆你的用户。另外,你的嵌套工厂接口和类应该是['static'](http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)。 – 2012-04-02 10:30:38

0

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

+0

我正在使用反射,但是需要不同的构造函数与最终用户的使用有关。但是我将使用工厂而不是构造函数。 – user978548 2012-04-02 19:49:26