public interface Function {
double apply(double arg);
Function derivative();
String toString();
}
public interface Integrable extends Function {
Function integrate();
}
public class Sum implements Function {
private Function func1, func2;
public Sum(Function func1, Function func2) {
this.func1 = func1;
this.func2 = func2;
}
@Override
public double apply(double arg) {
return func1.apply(arg) + func2.apply(arg);
}
@Override
public Function derivative() {
return new Sum(func1.derivative(), func2.derivative());
}
@Override
public String toString() {
return func1.toString() + " + " + func2.toString();
}
@Override
public Function integrate() {
//TODO only allow if (this instanceof Integrable)
try {
return new Sum(((Integrable) func1).integrate(), ((Integrable) func2).integrate());
} catch (ClassCastException e) {
throw new RuntimeException("could not call integrate on one of the functions of this sum, as it is not of type Integrable");
}
}
}
Я пытаюсь создать класс Sum
выше, но он должен иметь тип Integrable
, если обе функции также Integrable
.В противном случае это просто должно быть Function
.
. Есть ли способ сделать это эффективно, или лучше сделать его Integrable
по умолчанию и проверить 2 поля в integrate()
?