作为家庭作业,我被要求用java构建一些计算器。为了更容易创建表达式,我想添加构造函数,为创建Num和Var类提供“快捷方式”。例如,我希望能够编写新的Plus(“x”,5)并获得相同的结果表达式,而不是编写新的Plus(新的Var(“x”),新的Num(5))。为了不重复代码行,我创建了一个名为BinaryExpression的抽象类,里面是我构造函数所需的所有组合。我试图找出一种优雅的方法来构造一个加号类,而无需再次重写相同的代码。
public abstract class BinaryExpression implements Expression {
protected Expression x;
protected Expression y;
public BinaryExpression(Expression x, Expression y) {
this.x = x;
this.y = y;
}
public BinaryExpression(String x, Expression y) {
this(new Var(x),y);
}
public BinaryExpression(Double x, Expression y) {
this(new Num(x), y);
}
public BinaryExpression(Expression x, String y) {
this(x ,new Var(y));
}
public BinaryExpression(Expression x, Double y) {
this(x ,new Num(y));
}
public BinaryExpression(String x, String y) {
this(new Var(x) ,new Var(y));
}
public BinaryExpression(Double x, Double y) {
this(new Num(x) ,new Num(y));
}
public BinaryExpression(Double x ,String y){
this(new Num(x) ,new Var(y));
}
public BinaryExpression(String x ,Double y){
this(new String(x) ,new Num(y));
}
我正在寻找这样的解决方案:
public class Plus extends BinaryExpression {
public Plus(<String,Double, Expression> x, <String,Double, Expression> y) {
super(x, y);
}
所以我只接受这个类类型,它们将适合BinaryExpression类中的指定构造函数。谢谢 :)
问题是你需要一些对象的通用容器,它们可以被视为Expression的实例,而实际上它们不是Expression的实例。 (例如:String,Double)
这个答案假设如下:
class Num implements Expression
class Var implements Expression
并且存在以下构造函数,或者没有为类Expression定义构造函数
public Expression() {}
我认为一个好的解决方案就像@markspace建议的那样。您可以通过使用instanceof确定它的编译来确定将参数强制转换为什么。
public Plus(Object a, Object b) {
Expression exprA = convertToExpression(a);
Expression exprB = convertToExpression(b);
if(exprA == null || exprB == null) {
// could error handle here or in the place below
}
// do initialization here
}
//
public Expression convertToExpression(Object obj) {
Expression exprObj = null;
if(obj instanceof String) {
exprObj = new Var(obj);
} else if(obj instanceof Double) {
exprObj = new Num(obj);
} else {
// error handle here or in the place above
}
return exprObj;
}
另外,上面的代码中最后一个构造函数是否不正确?好像它应该是这样读的:
public BinaryExpression(String x, Double y) {
this(new Var(x), new Num(y));
}