我想编写一个抽象类'Expression',它接受Integer或Boolean表达式,并通过子类来评估它们,如'Add','Divide'代表Integer,'And','Or'代表布尔表达式.最后,它归结为编写实现自己的evaluate()方法的子类.我在一本书中找到了一个实现,但它只适用于双值.这里是:
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
}
Run Code Online (Sandbox Code Playgroud)
现在,对于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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我不希望任何人为我做功课,所以我只是问我的方法中的错误在哪里,如果有人能指出我正确的方向.谢谢.
以下是一些建议:
首先,您不应该使用原始类型,因此Const<T>应该扩展Expression<T>。
现在,您的integerConst和booleanConstConst方法看起来像工厂方法,所以它们应该是static.
也就是说,我不确定在类中使用这些工厂方法是个好主意,因为如果您想支持第三种表达式类型(除了and之外) Const,它会迫使您更改类型。相反,您可能需要考虑子类化:ConstBooleanIntegerConst
public class IntegerConst extends Const<Integer> {
public IntegerConst(Integer n) {
super(n);
}
}
public class BooleanConst extends Const<Boolean> {
public BooleanConst(Boolean b) {
super(b);
}
}
Run Code Online (Sandbox Code Playgroud)希望您可以从这里继续。