我试图理解这个多态性练习中的代码是如何工作的。
我想我理解这个概念;但是,我无法理解如何将其应用于等式: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
请注意,AdditionNode
和 MultiplicationNode
是 OpNode
的类型。
每个OpNode
指的是一个左Node
和一个右Node
。重要的是要了解这些 Node
中的任何一个都可以是 ValueNode
或 OpNode
。
不过不要忘记操作顺序。乘法先于加法。
因此,当您将这种关系表示为一系列节点时,您需要牢记这一点。
如果您的代码中有适当的构造函数(您没有),您可以使用依赖注入(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/