我正在尝试了解此多态性练习中的代码如何有效。
我认为我理解这个概念;但是,我很难理解如何将其应用于等式: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
请注意,AdditionNode
和MultiplicationNode
是OpNode
的类型。
每个OpNode
指的是左Node
和右Node
。重要的是要了解这些Node
s中的任何一个都可以是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
@override注释应高于从子类'或接口的方法中覆盖的任何方法。