java - 从特定表达式树到通用表达式树 - java
问题描述
我想编写一个抽象类“表达式”,它接受整数或布尔表达式,并通过子类来评估它们,如整数的“加”、“除”和布尔表达式的“与”、“或”。最后归结为编写实现自己的评估()方法的子类。我在一本书中找到了一个实现,但它只适用于双值。这里是:
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”,调用它的构造函数并通过 2 个 Const 对象的乘法实现 eval(),这些对象 eval() 本身并简单地返回它们被实例化的值。
如果我想用 Expr 来做这件事,它不会严格地计算为 double,而是 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;
}
}
现在我不想让任何人为我做功课,所以我只是问我的方法的错误在哪里,是否有人能指出我正确的方向。谢谢你。
解决方案
以下是一些建议:
首先,你不应该使用原始类型,所以
Const<T>
应该扩展Expression<T>
.现在,您的
integerConst
andbooleanConstConst
方法看起来像工厂方法,所以它们应该是static
.也就是说,我不确定在类中包含这些工厂方法是否是一个好主意,因为如果您想支持第三种表达式类型(除了and )
Const
,它会迫使您更改类型。相反,您可能需要考虑子类化:Const
Boolean
Integer
Const
public class IntegerConst extends Const<Integer> { public IntegerConst(Integer n) { super(n); } } public class BooleanConst extends Const<Boolean> { public BooleanConst(Boolean b) { super(b); } }
希望你能从这里继续。