在具体对象上调用具体方法,当前类型是抽象对象

时间:2017-11-13 12:11:01

标签: java

我有以下抽象类,它确保所有子类都包含方法eval()

public abstract class ExpressionTreeNode {
        abstract double eval();
} 

我想创建几个具体的类,它们继承自ExpressionTreeNode,就像类Addition一样。这些具体类包含两个具体的类(rightleft),它们继承自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;
    }
}

如何解决这个问题(不使用接口而不是抽象类)?

1 个答案:

答案 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());
    }
}
相关问题