有没有更简单的方法来调用子类';Java中子类和超类的ArrayList的s方法
我有一个类(我们称之为Vehicle)和一个子类(Car)。两者的实例都存储在一个ArrayList中。Car有一个不是从车辆继承的方法doStuff()。我想对ArrayList中的每一辆车都使用doStuff()。这是我想到的最简单的解决方案:有没有更简单的方法来调用子类';Java中子类和超类的ArrayList的s方法,java,inheritance,arraylist,Java,Inheritance,Arraylist,我有一个类(我们称之为Vehicle)和一个子类(Car)。两者的实例都存储在一个ArrayList中。Car有一个不是从车辆继承的方法doStuff()。我想对ArrayList中的每一辆车都使用doStuff()。这是我想到的最简单的解决方案: vehicleList = new ArrayList<Vehicle>(); roster.add(new Vehicle()); roster.add(new Car());
vehicleList = new ArrayList<Vehicle>();
roster.add(new Vehicle());
roster.add(new Car());
for (Vehicle v: vehicleList){
if (v instanceof Car){
((Car) v).doStuff();
}
}
vehicleList=新的ArrayList();
花名册。添加(新车());
花名册。添加(新车());
用于(车辆v:车辆列表){
if(车辆的v实例){
(汽车)v.多斯塔夫;
}
}
但我觉得有一种更简单的方法。因此,如果您能提供一个更简单的解决方案,请提前感谢。最“简单”的解决方案是在车辆中实现doStuff(),而不让它执行任何操作。e、 g
public void doStuff(args) { ; }
然而,这通常意味着设计不佳。可能是个好主意,也可能是个坏主意。如果您的列表被声明为
列表
,那么这就是正确的方法-如果不检查单个项目是卡车
,还是汽车
,或者其他东西,您就无法判断
如果Vehicle
拥有该方法是有意义的,您可以在那里声明doStuff
,让它默认不做任何事情,并在Car
中放置一个真正的实现。不过,这通常是糟糕设计的标志
另一个选择是获得一个列表
,这样您就不必检查列表中的每个项目的类型。您还可以将doStuff
作为接口CanDoStuff
的一部分,这样您就不必检查Car
——这样您也可以轻松地将其应用于其他类。有两个选项:
doStuff()
添加到Vehicle
(默认impl可以是“不做任何事情”)车辆是否可以“做事情”的方法。您可以在Vehicle
类中使用canDoStuff()
方法(仍然需要强制转换,基类开始“知道得太多”。您可以使用Car
实现一个CanDoStuff
界面-如果有一天您可能会有一辆Van
也可以使用,那么它比直接使用Car
要好一点
尽可能将类似类型的车辆存储在一起。这样你就不会有这个问题。问问自己,如果所有车辆的行为都不同,为什么要将所有车辆存储在一个列表中。结尾:)
您可以做一些棘手的事情,比如创建一个“过滤迭代器”,该迭代器基本上返回一个基于类类型的过滤子列表。这是一个高级主题,但是如果您的项目有非常突出的列表方法,那么您只需编写一次过滤器,然后在所有地方使用它。没有。如果
doStuff()
仅在Car
中声明,则需要一个Car
引用来调用它。我想,您可以添加doStuff
作为Vehicle
的抽象方法,如果你准备把Vehicle
作为一个抽象类。到目前为止,这是最详细的,新的答案几分钟内都没有出现,所以我把你的评为最佳。谢谢你的意见。