我正在尝试理解这种多态性练习中的代码是如何工作的。
我想我理解这个概念;但是,我无法理解如何将其应用于等式: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();
}
}
答案 0 :(得分:3)
注意 在我看来,Node
在这种情况下更适合定义为interface
。您确定它不是interface
而不是abstract class
吗?
您试图表示等式
1 + 2 * 3
根据您的代码,您有两种类型的Node
:
ValueNode
- 代表值OpNode
- 表示操作因此,根据您的等式,您有5个节点:
ValueNode = 1
AdditionNode = +
ValueNode = 2
MultiplicationNode = *
ValueNode = 3
请注意,AdditionNode
和MultiplicationNode
是OpNode
的类型。
每个OpNode
引用左Node
和右Node
。重要的是要了解这些Node
中的任何一个都可以是ValueNode
或OpNode
。
不要忘记操作顺序。乘法在加法之前出现。
因此,当您将此关系表示为一系列节点时,您需要牢记这一点。
如果你的代码上有适当的构造函数(你没有),你可以使用依赖注入执行以下操作:
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注释应该高于从子类或接口方法重写的任何方法。