在此多态性练习中,如何计算由一系列节点表示的方程式



我正在尝试了解此多态性练习中的代码如何有效。

我认为我理解这个概念;但是,我很难理解如何将其应用于等式:1 + 2 * 3

abstract class Node {
    abstract double evaluate();
}
public class ValueNode extends Node {
    double value;
    double evaluate() {
        return value;
    }
}
public abstract class OpNode extends Node {
    Node left;
    Node right;
    abstract double evaluate();
}
public class MultiplicationNode extends OpNode {
    double evaluate() {
        return left.evaluate() * right.evaluate();
    }
}
public class AdditionNode extends OpNode {
    double evaluate() {
        return left.evaluate() + right.evaluate();
    }
}

note 在我看来,在这种情况下,Node将更适当地定义为interface。您确定这不是interface而不是abstract class


您正在尝试表示方程

1 + 2 * 3

根据您的代码,您有两种类型的Node

  • ValueNode-表示值
  • OpNode-代表操作

因此,根据您的方程式,您有5个节点:

ValueNode = 1
AdditionNode = +
ValueNode = 2
MultiplicationNode = *
ValueNode = 3

请注意,AdditionNodeMultiplicationNodeOpNode的类型。

每个OpNode指的是左Node和右Node。重要的是要了解这些Node s中的任何一个都可以是ValueNodeOpNode

但是,不要忘记操作顺序。乘法是在添加之前。

所以,当您将这种关系表示为一系列节点时,您需要记住这一点。

如果您的代码上有适当的构造函数(不),则应使用依赖项注入以下操作:

Node node = new AdditionNode(
    new ValueNode(1),
    new MultiplicationNode(
        new ValueNode(2),
        new ValueNode(3)
    )
);

现在,当您致电

node.evaluate();

您将获得方程式的答案。


您的构造函数应该看起来像这样:

class ValueNode {
    double value;
    public ValueNode(double value) {
        this.value = value;
    }
}
class OpNode {
    Node left;
    Node right;
    public OpNode(Node left, Node right) {
        this.left = left;
        this.right = right;
    }
}

这是一个工作示例:http://ideone.com/ocvr8s

@override注释应高于从子类'或接口的方法中覆盖的任何方法。

最新更新