2014-03-30 188 views
-1

我的程序的頂部有一個接口(IVehicle),下面是一個實現大多數繼承方法(Vehicle)的類。從接口繼承

低於Vehicle是另外兩個類FueledNon-Fuelled

Fueled需要獲取/設置/增加fuel字段的方法,Non-Fulled不需要。

我的問題是,沒有把方法進入界面,當我嘗試從我的程序的其他地方調用它們的Java不會允許它 - 我要麼投(我不認爲這是一個不錯的選擇因爲我有兩種不同類型的Vehicle)或創建該方法。

反正是有解決這個問題,不是建立在接口中的方法等? 如果這是唯一的選擇,我將如何處理在Non-Fuelled類的繼承?

+0

請提供一些實際的代碼 –

+0

我不明白你爲什麼覺得鑄造不是一種選擇;也許發佈代碼,正如Dgrin91所建議的,會說明 –

回答

2

接口的全部意義在於,它代表了一個抽象層 - 你說:「所有類型的實現此接口支持這些行動。」

這聽起來像「改變燃料領域」根本就不該接口所屬的操作,因爲他們不是對所有的實現。使用該接口的代碼無法調用這些操作,因爲它們可能不被實現支持。

可以投,如果你真的想:

if (vehicle instanceof Fueled) { 
    Fueled fueled = (Fueled) vehicle; 
    // Perform Fueled-specific operations here 
} 

...那是通常(並不總是,但通常情況下),你的設計已經誤入歧途的跡象,你應該真的更仔細地考慮一下。它將代碼非常緊密地耦合到Fueled

或者你可以添加的操作IVehicle(這是不是在Java接口的傳統名字,順便說一句),只是實現它們與無操作方法,他們沒有任何意義。但這是一種設計氣味。 有時它可能是最乾淨的方法,但要儘量避免。

(這是很難給出具體的提醒,而不必在我們面前的現實設計情況。)

2

我認爲你有一個設計問題。

您應該考慮製作FueledNonFueled接口,然後讓它們通過FueledVehicleNonFueledVehicle具體類實現。

取決於你如何在內心深處這個層次願意代碼,它可能是字面一個FueledVehicleNonFueledVehicle類擴展抽象Vehicle和各執行自己的界面,或者具體型號等

由於在這個線程中被別人提到,如果你提供了一些實際的代碼,它會更容易幫助你。

另請注意,作爲最後的手段,您總是可以將UnsupportedOperationException放在實現的不應該實現的類的方法中,儘管在這種情況下,這仍然看起來像是一種解決方法。