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