2012-12-17 73 views
0

所以,我創建了一個名爲測試一個簡單的類,如下所示:繼承類分數/整數

import prog.utili.IntegerB; 
//It's a custom class 
class Test 
{ 
    public static void main(String[] args) 
    { 
     IntegerB a = new IntegerB(1); 
     IntegerB b = new IntegerB(2); 
     IntegerB sum = a.plus(b); 
     System.out.println(sum); 
    } 
} 

我想與傳承練習,所以我創建了兩個自定義類。分數...

package prog.utili; 
public class Fraction 
{ 
    private int num; 
    private int den; 

    public Fraction(int x, int y) 
    { 
     [...] 
    } 

    public Fraction(int x) 
    { 
     this(x, 1); 
    } 

    public Fraction plus(Fraction f) 
    { 
     int n = this.num * f.den + this.den * f.num; 
     int d = this.den * f.den; 
     return new Fraction(n, d); 
    } 

    [...] 
} 

...和IntegerB:

package prog.utili; 
public class IntegerB extends Fraction 
{ 
    public IntegerB(int num) 
    { 
     super(num); 
    } 

    public IntegerB plus(IntegerB other) 
    { 
     return (IntegerB)this.plus(other); 
    } 
} 

的問題是我不斷收到同樣的錯誤:

at prog.utili.IntegerB.plus(IntegerB.java:11) 

我知道我可以簡單地解決問題只刪除IntegerB上的最後一個方法,用

替換Test.java的第9行
IntegerB sum = (IntegerB)a.plus(b) 

但我絕對想要使用「加號」方法的繼承規則來做到這一點!

+0

如果你實際實施了'IntegerB.plus(IntegerB)'而不是隻是試圖轉發到其他實現,它可能會工作。 –

+2

你不會說你正在得到什麼錯誤......它是什麼? :-) –

+2

明顯'StackOverflowError' – jlordo

回答

1

要實現方法plus(IntegerB),請調用plus(IntegerB),它調用plus(IntegerB)等等,直到出現StackOverflowError。

提供您的方法的實際執行情況:

return new IntegerB(this.getNum() + other.getNum()); 

return new IntegerB(super.plus(other).getNum()); 

還要注意,通過

IntegerB sum = (IntegerB)a.plus(b); 

是行不通的更換Test.java的最後一行,因爲Fraction中的plus()方法不返回IntegerB,但是一個分數。您將因此得到一個ClassCastException。

0

這裏的問題是,IntegerB.plus不覆蓋Fraction.plus,它重載它。這是因爲參數類型不同。因此,當IntegerB.plus調用this.plus(other)時,它最終調用自己,然後調用自己,然後調用自己,直到你得到一個StackOverflow(因此發送給你stackoverflow:))。

看起來你想打電話給plus(Fraction)而不是plus(IntegerB)。要做到這一點,你可以明確地向上轉型other

return plus((Fraction) other); 

這就讓人有其他比告訴你要調用加上處理Fraction S的版本的編譯器,即使你知道你沒有效果有IntegerB

但是,這種方法就不會返回IntegerB,而只是一個Fraction分母是1.你可以想象覆蓋plus返回一個IntegerB如果結果的分母是1,但可能會導致意想不到的情況下a.plus(b)不等於b.plus(a),因爲一個是Fraction而另一個是IntegerB。或者,如果可能,您可以返回IntegerB對象Fraction.plus