簡體   English   中英

在Java中,有沒有更簡單的方法可以在子類和超類的ArrayList上調用子類的方法

[英]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> ,那么這就是正確的方法-您必須先檢查單個項目是TruckCar還是其他東西,才能知道。

如果Vehicle具有該方法有意義,則可以在其中聲明doStuff ,並使其默認不執行任何操作,然后在Car放置一個實際實現。 不過,這通常是不良設計的標志。

另一種選擇是改為獲取List<Car> ,因此您不必檢查列表中的每個項目的類型。 你也可以把doStuff作為接口的一部分CanDoStuff ,所以它不是Car你檢查-這種方式,您可以輕松地將其應用到其他類為好。

有2個選項:

  1. doStuff()添加到Vehicle (默認隱含可以是“不執行任何操作”)

  2. 符合您所擁有的東西。 弄清楚特定Vehicle可以“做某事”的某種方法。 您可以在Vehicle類中使用canDoStuff()方法(仍然需要canDoStuff()並且基類開始“了解太多”。)您可以使Car實現CanDoStuff接口-比直接使用Car更好。一天也有一輛可以做些事情的Van

盡可能將類似的類型存儲在一起。 那你就不會有這個問題了。 問自己,為什么所有車輛的行為都不同,為什么將它們存儲在一個列表中。 結束。 :)

您可以做一些棘手的事情,例如創建一個“過濾迭代器”,該過濾器本質上會根據類類型返回經過過濾的子列表。 這是一個高級主題,但是如果您的項目具有非常出色的列表方法,則只需編寫一次該過濾器,然后就可以使用它了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM