2010-04-13 110 views
1

我有一個抽象類飛機,和兩個類PassengerAirplane和CargoAirplane,它們擴展了飛機類。 我還有一個可衡量的接口,以及兩個實現它的類 - 人員和容器。
所以,飛機可以自己做很多事情,並且有一種方法可以將可度量的東西添加到飛機中(稱爲addAMeasurableThing)。 PassengerAirplane/CargoAirplane和僅僅是一架飛機之間的唯一區別是,addAeasurableThing應該只接受人/容器,而不是任何可衡量的事情。我如何實現這一點?Java繼承問題

我想這樣做:
飛機類:

公共抽象飛機 addAMeasurableThing(可測量米,整數 位);

PassengerAirplane類:

公衆飛機addAMeasurableThing 的(Measurable男,INT位置){如果(M 的instanceof人)...

CargoAirplane類:

public airplane addAeasurableThing (Meas urable男,INT位置){如果(M 的instanceof容器)...

但是當我調試它,我注意到addAMeasurableThing在CargoAirplane類不會被調用,因爲這兩種方法具有相同的簽名。那麼,根據正在傳遞的可測量事物的類型,如何調用適當的PassengerAirplane/CargoAirplane的addAasurableThing?

謝謝!

+0

也許會發布一些更多的代碼,聽起來好像還有其他的事情發生。 – 2010-04-13 01:48:13

+0

是的問題不清楚。你是什​​麼意思 「我注意到CargoAirplane類中的addAMeasurableThing永遠不會被調用,因爲兩個方法都有相同的簽名。」你的測試類實現是什麼? – 2010-04-13 01:51:35

+0

你確定你重寫了這個方法嗎?因爲如果你是,你不應該有你描述的問題。 – 2010-04-13 01:54:03

回答

6

使用泛型:

abstract class Airplane<M extends Measurable>{ 
    public abstract Airplane addAMeasurableThing(M m, int position); 
} 

class PassengerAirplane extends Airplane<People>{ 
    @Override 
    public Airplane addAMeasurableThing(People p, int position{ ... } 
} 
+0

這工作如廣告!謝謝。 – Misa 2010-04-13 02:23:23

0

嘗試尋找到讓你衡量的通用類,然後用例如Measurable<People>,Measurable<? extends Foo>

+0

我是Java的新手,所以完整的答案更有幫助。謝謝。 – Misa 2010-04-13 02:26:02

0

它不是確定被調用的參數類型,它是對象類型。所以這取決於你是否創建了一個PassangerPlane或一個CargoPlane傳入了調用addAMeasurableThing的方法。這是一個更大的設計問題,如何確保您只有正確類型的測量值才能進入飛機。例如,如果添加了錯誤的可測量值,則可能會引發異常,然後再調用堆棧來通知用戶該問題。這取決於什麼是確定需要傳遞給飛機的可測量物體。

您也可能需要一個靜態方法在Airplane(或一個新的AirplaneFactory類)上,根據您傳遞給它的示例Mesurable,它可以爲您提供正確的子類。

+0

這確實有幫助。謝謝。 – Misa 2010-04-13 02:24:22