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

时间:2014-02-04 20:09:41

标签: java polymorphism

我正在尝试理解这种多态性练习中的代码是如何工作的。

我想我理解这个概念;但是,我无法理解如何将其应用于等式: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();
    }
}

2 个答案:

答案 0 :(得分:3)

注意 在我看来,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中的任何一个都可以是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

答案 1 :(得分:0)

@Override注释应该高于从子类或接口方法重写的任何方法。