基本上,我有:

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有什么不了解的地方吗?还是我的设计不好?或者.. ?

    最佳答案

    子类必须调用一个父类(super class)构造函数中的一个(或者,如果您按照示例中的定义重新定义,则两者都调用);但是您不能强制它重新定义具有父类(super class)相同签名的构造函数。

    确保调用父类(super class)构造函数的唯一方法是在父类(super class)中只有一个构造函数。

    我认为您应该考虑一种重新设计您的父类(super class)(也许创建2个类)的方法,如果您希望始终调用它,则仅具有一个构造函数。

    但是,如果希望特定的构造函数出现在子类中,则应隔离工厂中的“构造”问题;您可以在其中为每个子类都有特殊的工厂类。您的工厂将实现此接口(interface):

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

    09-10 06:26
    查看更多