2017-11-13 9 views
0

すべてのサブクラスにeval()というメソッドが含まれていることを保証する次の抽象クラスがあります。現在の型が抽象オブジェクトである具体的なオブジェクトに対して具体的なメソッドを呼び出す

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

私はクラスAdditionのように、ExpressionTreeNodeから継承いくつかの具象クラスを作成したいと思います。これらの具体的なクラスは、ExpressionTreeNodeを継承する2つの他の具体的なクラス(rightleft)を含んでいます。異なる具象クラスがあるかもしれないので、私は変数型をExpressionTreeNodeと定義しました。

さらに、これらの具体的なクラスからeval()メソッドを呼び出したいと思います。しかし、Eclipseは、この時点で言う(例えばdouble arg1 = right.eval();):

メソッドのeval()型ExpressionTreeNode

なぜそれが未定義であるために定義されていませんか?タイプが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

あなたは[最小限のテストケース](https://stackoverflow.com/help/mcve)を構築することはできますか? –

+4

このメソッドはpublicではなく、 'Addition'クラスは同じパッケージにありません。 – daniu

+0

'@ Override'を追加するときにこのエラーが見つかりました。これは常に賢明なことです。特に 'public'はインターフェースには必要なく、インターフェースに変更するときは' public'を追加する必要があります。 @ daniuあなたのコメントを答えにしてください。 –

答えて

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()); 
    } 
} 
関連する問題