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