将类型转换为其他类型

时间:2014-04-17 02:51:07

标签: java

我要做的是让这行代码在我的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对象的方法将其放在那里,但构造函数应该设置一个对象,以便对象的状态有效。无论如何我可以解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

您需要充分利用您的界面,以便您可以不加区分地处理值和运算符表达式。现在你没有这样做,例如Operation,它将两个Value作为参数,但将它们存储为Expression s。

您还遇到一个问题,即Operation的子类声明了名为lhsrhs的重复成员。也许您已经注意到,如果您尝试在AddMultiply上调用方法,那么现在您将获得空指针异常。

这是一个轻微的重新设计:

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类执行添加并返回值。)