Страницы

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

понедельник, 27 мая 2019 г.

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

Как вызвать в абстрактном классе конструктор того класса, конкретно который его наследует? Типа такого:
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


Ответ

Прежде всего в хорошем дизайне базовый класс ничего не должен знать о своих наследниках, иначе нарушается одна из основ ООП о программировании по контракту.
Сделайте еще один абстрактный метод и переопределяйте его в наследниках таким образом, чтобы они возвращали новые экземпляры своего типа:
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; }

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

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