我有一个类(让我们称之为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();
}
}
但我觉得有一种更简单的方法可以做到这一点。如果您能提供更简单的解决方案,请提前感谢。
答案 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)
有两个选项:
将doStuff()
添加到Vehicle
(默认impl可能是“什么都不做”)
你所拥有的东西。某种方法可以确定特定Vehicle
是否可以“做事”。您可以在canDoStuff()
类中使用Vehicle
方法(仍然需要演员和基类开始“知道太多”。您可以Car
实现CanDoStuff
界面 - 比直接使用Car
更有效,如果有一天你可能有Van
也可以做到这一点。
答案 3 :(得分:0)
尽可能将类型存储在一起。那你就不会有这个问题。问问自己为什么将所有车辆存放在一个列表中,如果它们的行为都不同。结束。 :)
你可以做一些棘手的事情,比如创建一个&#34;过滤迭代器&#34;它基本上返回基于类类型的过滤子列表。这是一个高级主题,但是如果你的项目列表方法非常突出,你可以编写一次过滤器并在整个地方使用它。