是否有更简单的方法在Java中的子类和超类的ArrayList上调用子类方法

时间:2014-02-13 05:24:23

标签: java inheritance arraylist

我有一个类(让我们称之为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();
                    }
            }

但我觉得有一种更简单的方法可以做到这一点。如果您能提供更简单的解决方案,请提前感谢。

4 个答案:

答案 0 :(得分:0)

“最简单”的解决方案是在Vehicle中实现doStuff(),并且不做任何事情。 e.g。

public void doStuff(args) { ; }

然而,这通常是一种糟糕的设计暗示。可能是个好主意,可能不好。

答案 1 :(得分:0)

如果您的列表被声明为List<Vehicle>,那么这是正确的方法 - 如果不检查单个项目是Truck还是Car,您就无法判断或者别的什么。

如果Vehicle拥有该方法是有意义的,您可以在那里声明doStuff,默认情况下不执行任何操作,并在Car中添加实际的实现。这通常是糟糕设计的标志。

另一种选择是获得List<Car>,因此您不必检查列表中的每个项目的类型。您也可以将doStuff作为界面CanDoStuff的一部分,因此不是Car您要检查的内容 - 这样您就可以轻松地将其应用到其他类中。

答案 2 :(得分:0)

有两个选项:

  1. doStuff()添加到Vehicle(默认impl可能是“什么都不做”)

  2. 你所拥有的东西。某种方法可以确定特定Vehicle是否可以“做事”。您可以在canDoStuff()类中使用Vehicle方法(仍然需要演员和基类开始“知道太多”。您可以Car实现CanDoStuff界面 - 比直接使用Car更有效,如果有一天你可能有Van也可以做到这一点。

答案 3 :(得分:0)

尽可能将类型存储在一起。那你就不会有这个问题。问问自己为什么将所有车辆存放在一个列表中,如果它们的行为都不同。结束。 :)

你可以做一些棘手的事情,比如创建一个&#34;过滤迭代器&#34;它基本上返回基于类类型的过滤子列表。这是一个高级主题,但是如果你的项目列表方法非常突出,你可以编写一次过滤器并在整个地方使用它。