2014-09-12 73 views
0

這是我的大學課程。抽象類獲取「無法找到符號」錯誤

我有這樣的頂層抽象類,Expression.java(由教授提供):

public abstract class Expression { 
    public abstract int eval(); 
    public abstract String toString(); 
} 

BinaryExpression.java(也由教授提供),其延伸Expression.java:

public abstract class BinaryExpression extends Expression { 

    protected Expression left; 
    protected Expression right; 

    public BinaryExpression (Expression l, Expression r) { 
     left = l; 
     right = r; 
    } 

    public abstract int eval(); 
    public abstract String toString(); 
} 

最後Add.java(我寫這篇)擴展BinaryExpression.java:

public class Add extends BinaryExpression { 

    //Fields 
    protected Expression left; 
    protected Expression right; 

    //Constructor 
    public Add(Expression l, Expression r) { 
     left = l; 
     right = r; 
    } 

    //Methods 
    public int eval() { 
     return left.eval()+right.eval(); 
    } 

    public String toString() { 
     return left + "+" + right; 
    } 
} 

測試人員Test.java也提供了。還有其他三個類擴展了BinaryExpression,Subtract,Multiply和Divide,但它們實際上與Add相同。 Plus和Minus只是存儲一個值,可以是負值也可以是正值。

public class Test { 
    public static void main (String [] args) { 
     Expression s1 = new SimpleExpression(10); 
     Expression s2 = new SimpleExpression(-3); 
     System.out.println("s1: " + s1 + " = " + s1.eval());   
     System.out.println("s2: " + s2 + " = " + s2.eval());   
     Expression u1 = new Plus(s2);  
     Expression u2 = new Minus(s1);  
     System.out.println("u1: " + u1 + " = " + u1.eval());   
     System.out.println("u2: " + u2 + " = " + u2.eval()); 
     Expression b1 = new Add(u1, s2); 
     Expression b2= new Subtract(s1, u2); 
     Expression b3= new Multiply(u1, b1); 
     Expression b4= new Divide(u2, b3); 
     System.out.println("b1: " + b1 + " = " + b1.eval());   
     System.out.println("b2: " + b2 + " = " + b2.eval());   
     System.out.println("b3: " + b3 + " = " + b3.eval());   
     System.out.println("b4: " + b4 + " = " + b4.eval()); 
     Expression e = new Minus(new Multiply(b3, b2));  
     System.out.println("e: " + e + " = " + e.eval()); 
     // example given in the assignment 
     e = new Divide(new Add(new Minus(new SimpleExpression (10)), 
           new SimpleExpression (50)), 
         new Minus(new Multiply(new SimpleExpression(5), 
               new Minus (new SimpleExpression (3))))); 

     System.out.println("Another e: " + e + " = " + e.eval()); 
    } 
} 

當我編譯Test.java,我得到這個錯誤(和一個類似的減,乘,除):

./Add.java:8: cannot find symbol 
symbol : constructor BinaryExpression() 
location: class BinaryExpression 
    public Add(Expression l, Expression r) { 

發生了什麼事?

回答

4

的根本原因就在這裏

public Add(Expression l, Expression r) { 
    left = l; 
    right = r; 
} 

你的子類試圖隱式調用一個無參數的構造函數超強。你的父類沒有這樣的無參數構造函數。所以,相反,還援引其現有的構造

public Add(Expression l, Expression r) { 
    super(l, r); 
    left = l; 
    right = r; 
} 

,你在Add類重新聲明leftright領域。這樣做沒有意義。您的孩子班級已經可以訪問其父級的leftright字段。

相關問題