我有以下抽象类,它确保所有子类都包含方法eval()
。
public abstract class ExpressionTreeNode {
abstract double eval();
}
我想创建几个具体的类,它们继承自ExpressionTreeNode,就像类Addition
一样。这些具体类包含两个具体的类(right
和left
),它们继承自ExpressionTreeNode
。由于可能有不同的具体类,我将变量类型定义为ExpressionTreeNode
。
此外,我想从这些具体类中调用eval()
方法。但Eclipse此时表示(例如double arg1 = right.eval();
):
对于ExpressionTreeNode类型
,方法eval()未定义
为什么不定义?不能存在仅ExpressionTreeNode
类型的对象,因此它将包含eval()
方法。
public class Addition extends ExpressionTreeNode {
ExpressionTreeNode left;
ExpressionTreeNode right;
public double eval() {
double arg1 = left.eval();
double arg2 = right.eval();
return arg1+arg2;
}
}
如何解决这个问题(不使用接口而不是抽象类)?
答案 0 :(得分:1)
正如@daniu在评论中指出的那样,这可能是因为没有公开您的方法。
这是一个显示您的基本架构有效的工作示例:
public class TreeClasses {
public static abstract class ExpressionTreeNode {
public abstract double eval();
}
public static class Addition extends ExpressionTreeNode {
ExpressionTreeNode left;
ExpressionTreeNode right;
public Addition(ExpressionTreeNode left, ExpressionTreeNode right) {
this.left = left;
this.right = right;
}
public double eval() {
double arg1 = left.eval();
double arg2 = right.eval();
return arg1+arg2;
}
}
public static class Constant extends ExpressionTreeNode {
double val;
public Constant(double val) {
this.val = val;
}
@Override
public double eval() {
return val;
}
}
public static void main(String[] args) {
ExpressionTreeNode tree = new Addition(new Constant(1),new Constant(2));
System.out.println(tree.eval());
}
}