Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Вызвать конструктор наследника в абстрактном классе

#java #ооп


Как вызвать в абстрактном классе конструктор того класса, конкретно который его наследует?
Типа такого:

public abstract class AbstractClass {

    public Abstract foo() {
        //Когда метод foo вызовется наследником
        AbstractClass a = new this(); //здесь надо вызвать конструктор наследника
        a.bar(); //как-то меняем состояние, вызывая метод наследника
        return a; //и возвращаем экземпляр наследника
    }

    public abstract void bar();
}


Но в данном примере выдает ошибку:


  java: as of release 8, 'this' is allowed as the parameter name for the
  receiver type only, which has to be the first parameter

    


Ответы

Ответ 1



Прежде всего в хорошем дизайне базовый класс ничего не должен знать о своих наследниках, иначе нарушается одна из основ ООП о программировании по контракту. Сделайте еще один абстрактный метод и переопределяйте его в наследниках таким образом, чтобы они возвращали новые экземпляры своего типа: public abstract class AbstractClass { public AbstractClass foo() { AbstractClass a = createInstance(); a.bar(); return a; } public abstract void bar(); protected abstract AbstractClass createInstance(); } public class ConcreteClass extends AbstractClass { protected override AbstractClass createInstance() { return ConcreteClass(); } } Если все-таки не хочется трогать наследников и пойти грязным путем, то можно использовать рефлексию (однако в таком случае у всех наследников должен быть конструктор без параметров): public Abstract foo() { AbstractClass a = this.getClass().newInstance(); a.bar(); return a; }

Комментариев нет:

Отправить комментарий