我要做的是让这行代码在我的main方法中运行:
Expression exp = new Add(new Value(3.2), new Multiply(new Value(4.1),
new Value(7.1)));
这是我的代码:
public interface Expression {
public int accept(EvaluationVisitor visitor);
}
我的操作班
public class Operation implements Expression {
private Expression lhs;
private Expression rhs;
public Operation(Value lhs, Value rhs)
{
this.lhs = lhs;
this.rhs = rhs;
}
public Expression getLHS()
{
return lhs;
}
public Expression getRHS()
{
return rhs;
}
public int accept(EvaluationVisitor visitor) {
return 0;
}
}
值类(表示浮点值):
public class Value implements Expression {
private float number;
public Value(float number)
{
this.number = number;
}
public String toString()
{
return String.valueOf(number);
}
public float getValue()
{
return number;
}
public int accept(EvaluationVisitor visitor) {
return 0;
}
}
我的添加和乘法方法:
public class Add extends Operation {
private Value lhs;
private Value rhs;
public Add(Value lhs, Value rhs)
{
super(lhs,rhs);
}
public String toString()
{
return String.valueOf(lhs.getValue() + rhs.getValue());
}
public Value add()
{
return new Value(lhs.getValue() + rhs.getValue());
}
}
public class Multiply extends Operation{
private Value lhs;
private Value rhs;
public Multiply(Value lhs, Value rhs)
{
super(lhs,rhs);
}
public String toString()
{
return String.valueOf(lhs.getValue() + rhs.getValue());
}
public Value mul()
{
return new Value(lhs.getValue() * rhs.getValue());
}
}
这是代码行:
Expression exp = new Add(new Value(3.2), new Multiply(new Value(4.1),
new Value(7.1)));
在我试图开始工作的代码行中,我想找到一种方法,即Multiply对象可以作为参数获取值。我知道我可以创建对象,然后通过调用返回Value对象的方法将其放在那里,但构造函数应该设置一个对象,以便对象的状态有效。无论如何我可以解决这个问题吗?
答案 0 :(得分:1)
您需要充分利用您的界面,以便您可以不加区分地处理值和运算符表达式。现在你没有这样做,例如Operation
,它将两个Value
作为参数,但将它们存储为Expression
s。
您还遇到一个问题,即Operation
的子类声明了名为lhs
和rhs
的重复成员。也许您已经注意到,如果您尝试在Add
和Multiply
上调用方法,那么现在您将获得空指针异常。
这是一个轻微的重新设计:
public interface Expression {
public Value evaluate();
}
public class Value implements Expression {
private final float floatValue;
public Value(float floatValue) {
this.floatValue = floatValue;
}
public float floatValue() {
return floatValue;
}
@Override
public Value evaluate() {
return this;
}
}
public abstract class BinaryOperator implements Expression {
protected final Expression lhs, rhs;
public BinaryOperator(Expression lhs, Expression rhs) {
this.lhs = lhs;
this.rhs = rhs;
}
}
public class Add extends BinaryOperator {
public Add(Expression lhs, Expression rhs) {
super(lhs, rhs);
}
@Override
public Value evaluate() {
return new Value(
lhs.evaluate().floatValue()
+
rhs.evaluate().floatValue()
);
}
}
public class Multiply extends BinaryOperator {
public Multiply(Expression lhs, Expression rhs) {
super(lhs, rhs);
}
@Override
public Value evaluate() {
return new Value(
lhs.evaluate().floatValue()
*
rhs.evaluate().floatValue()
);
}
}
现在你可以做到
Expression exp = (
new Add(new Value(3.2f), new Multiply(new Value(4.1f), new Value(7.1f)))
);
System.out.println(exp.evaluate().floatValue());
哪个输出32.309998
(正确答案)。
如果evaluate
只返回float
,则可以进一步简化上述重新设计。
答案 1 :(得分:0)
构造函数采用Value
个对象,但Multiply
不会延伸Value
答案 2 :(得分:0)
您正在做的是为操作添加值。你真正想做的是为一个值添加一个值(后者是一个操作的结果)。所以你应该做到以下几点:
Expression exp = new Add(new Value(3.2), new Multiply(new Value(4.1),
new Value(7.1)).mul());
或者,您可以使Operation
类扩展Value
并覆盖getValue()
类中的Multiply
方法以执行乘法并返回值(同样在Add
类执行添加并返回值。)