2012-02-16 73 views
0

我該如何強制所有Car s應該有Tyre s的特定類型?我正在使用Java 1.3(用於移動設備),因此無法使用泛型。如何更改重寫方法的返回類型?

abstract class Car{ 

    private Tyre[] tyres; 

    protected Car(){ 
     tyres = createTyres(); 
    } 

    protected abstract Tyre[] createTyres(); 

    public Tyre[] getTyres(){ 
     return tyres; 
    } 
} 

abstract class Tyre{} 

//Concrete classes 
class SlickTyre extends Tyre{} 

class RacingCar extends Car { 
    public RacingCar(){ 
    } 
    protected SlickTyre[] createTyres(){ 
     return new SlickTyre[]{}; 
    } 
    public SlickTyre[] getTyres(){ 
     //this won't compile as it overrides the parent return type  
    } 
+0

爲什麼要返回SlickTyre?通常情況下,您的RacingCar類將會像FourByFour和Compact一樣返回Tire,但讀取由RacingCar返回的Tire的TreadDepth屬性將返回0. – 2012-02-16 23:21:17

+0

思路不錯,但'SlickTyre'具有一些額外的屬性,例如'operatingTemperature',它們不會坐在'Tyre'內很好+ – donturner 2012-02-16 23:35:14

回答

2

不幸的是,covariant return type僅從java5被添加到java。舊版本[如1.3]不需要差異返回類型。

可以在this article

+0

+1換句話說這個例子用Java 1.5+編譯 – 2012-02-16 23:30:35

1

閱讀更多關於它如果SlickTyre有額外的特性/功能那麼其他輪胎,你可能已經打破了LSP principle

如果您正在使用J2ME(您提到的移動設備),一般的做法是避免抽象(如果不需要),這些額外開銷可能會影響jar的大小和性能。那麼,我們練習5年前手機要求jar文件小於64kb。

+1

好點。我不認爲我違反了LSP,因爲'SlickTyre'只是添加了屬性,並沒有定義任何會影響超類的行爲的新行爲。我讀得越多,我越是認爲繼承的範圍是有限的,在這種情況下,'Tyre'接口可能更合適。 – donturner 2012-02-19 11:38:00