Я хочу написать абстрактный класс «Выражение», который принимает целочисленные или логические выражения и оценивает их с помощью подклассов, таких как «Добавить», «Разделить» для целых и «И», «Или» для логических выражений.В конце концов, все сводится к написанию подклассов, которые реализуют собственный методvalu ().Я нашел реализацию в книге, но она работает только с двойными значениями.Вот оно:
abstract class Expr {
abstract double eval();
}
abstract class BinOp extends Expr {
Expr left;
Expr right;
BinOp(Expr l, Expr r) {
}
}
class Const extends Expr {
private double value;
Const( double val ) {
this.value = val;
}
double eval () {
return this.value;
}//eval
}
Теперь для класса BinOp я могу написать класс Add, который расширяет его, вызывает его конструктор и реализует eval () с умножением 2 объектов Const, которые eval () сами и просто возвращают значение, с которым они были созданы.
Как бы это работало, если бы я хотел сделать это с Expr, который не обязательно должен быть удвоен, но имеет тип int или boolean?Я перечитал дженерики, но не могу правильно спроектировать классы, такие как Expr, чтобы мой код компилировался.Вот моя попытка:
public abstract class Expression<T> {
abstract T evaluate();
}
public class Const<T> extends Expression{
private T n;
public Const(T x) { n = x; }
public Const<Integer> integerConst(Integer n) {
return new Const<>(n);
}
public Const<Boolean> booleanConstConst(Boolean n) {
return new Const<>(n);
}
public T evaluate() {
return n;
}
}
Теперь я не хочу, чтобы кто-то делал за меня домашнее задание, поэтому я просто спрашиваю, в чем заключается ошибка в моем подходе и может ли кто-нибудь указать мне правильное направление,Спасибо.