java - 在这个多态性练习中,我如何计算由一系列节点表示的方程式?

标签 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();
    }
}

最佳答案

注意 在我看来,在这种情况下,Node 更适合定义为 interface。你确定它不是一个 interface 而不是 abstract class 吗?


你正试图表示等式

1 + 2 * 3

根据您的代码,您有两种类型的节点:

  • ValueNode - 代表一个值
  • OpNode - 代表一个操作

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

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

请注意,AdditionNodeMultiplicationNodeOpNode 的类型。

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

不过不要忘记操作顺序。乘法先于加法。

因此,当您将这种关系表示为一系列节点时,您需要牢记这一点。

如果您的代码中有适当的构造函数(您没有),您可以使用依赖注入(inject)执行以下操作:

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

关于java - 在这个多态性练习中,我如何计算由一系列节点表示的方程式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21562345/

相关文章:

java - 寻找一种干净的方法来处理 RxJava 中的错误

java - 如何查找字符串中连续双字母(大写字母)的数量?

java - TIBCO JMS jar 文件

c# - 在基类集合上调用派生方法

Java继承层次动物类

java - 避免 Android 中 Java 代码生成 JNI 错误

java - Selenium 测试花费的时间异常长

c++ - 未调用继承的重写方法

Javascript 继承对象

hibernate - 具有具体类特定属性条件的多态 HQL 查询;可以做到吗?