[英]Is there an easier way to call a subclass's method on an ArrayList of both the subclass and superclass in Java
我有一個類(我們稱它為Vehicle)和一個子類(Car)。 兩者的實例都存儲在一個ArrayList中。 Car的方法doStuff()不是從車輛繼承的。 我想對ArrayList中的每輛車都做doStuff()。 這是我想到的最簡單的解決方案:
vehicleList = new ArrayList<Vehicle>();
roster.add(new Vehicle());
roster.add(new Car());
for (Vehicle v: vehicleList){
if (v instanceof Car){
((Car) v).doStuff();
}
}
但是我覺得有一種更簡單的方法可以做到。 因此,在此先感謝您能提供一個更簡單的解決方案。
“最簡單”的解決方案是在Vehicle中實現doStuff(),而不執行任何操作。 例如
public void doStuff(args) { ; }
但是,這通常表明設計不佳。 可能是個好主意,也可能是個壞主意。
如果將列表聲明為List<Vehicle>
,那么這就是正確的方法-您必須先檢查單個項目是Truck
, Car
還是其他東西,才能知道。
如果Vehicle
具有該方法有意義,則可以在其中聲明doStuff
,並使其默認不執行任何操作,然后在Car
放置一個實際實現。 不過,這通常是不良設計的標志。
另一種選擇是改為獲取List<Car>
,因此您不必檢查列表中的每個項目的類型。 你也可以把doStuff
作為接口的一部分CanDoStuff
,所以它不是Car
你檢查-這種方式,您可以輕松地將其應用到其他類為好。
有2個選項:
將doStuff()
添加到Vehicle
(默認隱含可以是“不執行任何操作”)
符合您所擁有的東西。 弄清楚特定Vehicle
可以“做某事”的某種方法。 您可以在Vehicle
類中使用canDoStuff()
方法(仍然需要canDoStuff()
並且基類開始“了解太多”。)您可以使Car
實現CanDoStuff
接口-比直接使用Car
更好。一天也有一輛可以做些事情的Van
盡可能將類似的類型存儲在一起。 那你就不會有這個問題了。 問自己,為什么所有車輛的行為都不同,為什么將它們存儲在一個列表中。 結束。 :)
您可以做一些棘手的事情,例如創建一個“過濾迭代器”,該過濾器本質上會根據類類型返回經過過濾的子列表。 這是一個高級主題,但是如果您的項目具有非常出色的列表方法,則只需編寫一次該過濾器,然后就可以使用它了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.