#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; }
Комментариев нет:
Отправить комментарий