#java #constructor
#java #конструктор
Вопрос:
Я пытаюсь сделать возможным инициализацию экземпляра функции класса следующим образом.
Function chain = new CosineFunction(new SquareRootFunction(new SineFunction()));
Это код для суперкласса Function
public class Function {
private Function innerFunction;
public Function() {
}
public Function(Function innerFunction) {
this.innerFunction = innerFunction;
}
public double calculate(double value) {
if(innerFunction != null) {
return innerFunction.calculate(value);
} else {
return this.formula(value);
}
}
protected double formula(double value) {
return value;
}
public Function getInnerFunction() {
return innerFunction;
}
public void setInnerFunction(Function innerFunction) {
this.innerFunction = innerFunction;
}
}
Любой другой класс с «функцией» в конце имени является подклассом Function
. Единственным @Override
является protected double formula(double value)
.
Если я пытаюсь инициировать цепочку, я получаю сообщение об ошибке:
Косинефункция конструктора (SquareRootFunction) не определена
Как мне прояснить, что все подклассы Function
также разрешены в конструкторе?
Комментарии:
1. Ваша проблема связана с конструктором
CosineFunction
, поэтому вам нужно показать свой кодCosineFunction
. Конструкторы не наследуются, поэтому вам нужно определить соответствующий конструктор в каждом подклассе.2. В качестве обходного пути должна быть возможность определить метод
of(Function f) {setInnerFunction(f); return this;}
вFunction
, а затем использовать его какnew CosineFunction().of(new SquareRootFunction().of(new SineFunction()))
. Недостатком является тоinnerFunction
, что этого не может бытьfinal
, но сейчас это не так (но, вероятно, должно быть).3. Ах, я не знал, что конструкторы не наследуются, спасибо