2

所有,什麼是更好的方法?溯造型?接口?抽象類?

我必須這樣做不對。這在當時似乎是一個好主意,但隨着我進一步深入,我認爲有一個更合適的方案去實現它。因此,我問你...

一注。我正在使用Google AppEngine和數據存儲來存儲這些信息。

好吧......可以說我有車的一個超類,然後有3個子類...汽車,卡車,摩托車。

在超類中,有3個屬性...製造商,型號,類型

例如,這些可能是:

  • 製造商:福特
  • 型號:關注
  • 類型:汽車

所以在數據存儲中,我有許多具有這些屬性的Vehicle實體。 所以,如果用戶想要看到所有的汽車......我用「汽車」類型來拉動汽車。

然後,如果用戶想要添加這些車輛之一的「收藏夾」列表中,我基於它是什麼類型,然後轉換的車對象到其具體的子類。然後添加該特定子類的額外屬性。

這個新的子實體存儲在數據存儲中,並添加了它的屬性。

所以基本上,我是從汽車到汽車的向下轉彎。我通過在Car類中創建一個額外的構造函數來完成此操作,該類將Vehicle作爲參數。一旦創建,Car對象現在具有所有屬性(製造商,型號,類型)集以及與其特定實現一起提供的所有新屬性。

這似乎錯綜複雜,錯誤。它的工作原理,但必須有一個更好的方式來做到這一點。

我選擇了這條路的主要原因是因爲GAE數據存儲的工作方式。它的「便宜」來存儲超級類別和它的有限屬性並查詢它們。很長的故事。

我試圖環繞使用接口和/或抽象類爲這個我的頭,但我希望得到您的所有投入。

感謝您的幫助。

回答

0

我不認爲你想在這裏超級/子類結構。您所描述的問題是您將對象從一種類型「更改」爲另一種類型,並且您無法更改Java對象的類型。您可以創建一個新對象,但是必須將所有信息從一個移動到另一個,並且維護成爲問題。

我建議你有一個代表你的車一類,而且它包含的參考輸入特定信息;代表每個特定類型的類都可以擴展某些內容,並且可能應該使得車輛內部嘗試使用該類型的方法可以調用常用方法來執行,而不管類型如何。但這樣,一旦你決定了具體的類型,你可以將它添加到現有的車輛對象,而不是「改變」它。

你也可以探索一個枚舉類型是否可以滿足你對類型特定數據的需求 - 枚舉類型可以使用構造函數,還可以使用額外的方法等。 - 有關枚舉的Oracle/Java教程涵蓋了這一點。

0

車輛類型被編碼兩次:一次作爲對象類型,一次作爲屬性。擺脫其中的一個,這樣就不會有卡車(對象類型)的屬性值設置爲Car的可能性。保持你的物體結構或屬性指出車輛的類型(我推薦使用Enum),但不能同時使用兩者。

要降級,您不需要創建子類型的新對象。只是沮喪:

Car myCar = (vehicle instanceof Car ? (Car)vehicle : null); 
相關問題