Как прояснить в конструкторе, что объект может быть вставлен, а также все подклассы этого объекта?

#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. Ах, я не знал, что конструкторы не наследуются, спасибо