Java-подкласс: несколько конструкторов, унаследованных от абстрактного суперкласса - PullRequest
5 голосов
/ 02 апреля 2012

В основном у меня есть:

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 ]

1 голос
/ 02 апреля 2012

Подкласс должен вызвать один (или оба, если вы переопределите оба, как в вашем примере) конструкторов суперкласса;но вы не можете заставить его переопределить конструкторы с теми же сигнатурами суперкласса.

Единственный способ гарантировать, что конструктор суперкласса называется , это иметь только один конструктор в суперклассе.

Я думаю, вам следует подумать о способе перепроектирования вашего суперкласса (возможно, создания 2 классов), чтобы иметь только один конструктор, если вы хотите, чтобы он вызывал всегда .1013 *

Но, если вы хотите, чтобы конкретный конструктор присутствовал в подклассе, вы должны изолировать «конструкционную» проблему на фабрике;где вы можете иметь специальные фабричные классы для каждого из ваших подклассов.Ваши фабрики будут реализовывать этот интерфейс:

interface AbstractClassFactory {
  AbstractClass create( Type arg0, Type arg1, Type arg2 );
  AbstractClass create( Type onlyOneArg );
}
0 голосов
/ 02 апреля 2012

Конструкторы не наследуются в Java.Это может иногда раздражать, но это так.Я не понимаю, почему вы хотите, чтобы каждый подкласс реализовывал оба конструктора.Вы пишете: «В программе я создаю экземпляры обоих конструкторов, не зная точного типа».Что ты имеешь в виду?Вы не можете создать экземпляр абстрактного класса, вам нужно знать, какой конкретный тип вы создали с помощью «new».Если вы используете отражение, вы можете проверить доступные конструкторы во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...