Java 如何在概念上添加多态性?
我有一个小组项目,它涉及一个Java程序,用于模拟冰淇淋店,并将其转换为GUI应用程序 这家商店预装了16种不同的冰淇淋。商店里有工人,也有收银员和存货员(这两种人都来自工人,收银员有耐心,存货员有耐力) 工人(以及收银员/存货员)能够供应冰淇淋。只有收银员才能处理订单,只有存货员才能补充冰激凌(每个冰激凌从80勺开始) 在给定的时间只有一个活跃的出纳/存货人,并且可能有一个出纳/存货人在休息。工人从一个文件(其中每一行都明确说明它是工人、存货人还是出纳)加载到各自的数组列表中(其中有工人的ArrayList、存货人的ArrayList和出纳的ArrayList) 我现在发现将其转换为GUI非常复杂,需要处理3个ArrayList。我想更改项目以将所有Worker保存到一个Worker类型的ArrayList中。但是,车间内的许多操作已经在假设三个不同的ArrayList的情况下定义/执行 更改代码以将整个Worker文件加载到一个Worker类型的ArrayList很简单。但是,如何在概念上更改商店的其余功能以使用一个ArrayList 例如,如果我想将商店的活动出纳设置为Bill,我如何导航ArrayList以仅查找出纳,然后查找Bill,然后将其设置为活动Java 如何在概念上添加多态性?,java,arraylist,polymorphism,Java,Arraylist,Polymorphism,我有一个小组项目,它涉及一个Java程序,用于模拟冰淇淋店,并将其转换为GUI应用程序 这家商店预装了16种不同的冰淇淋。商店里有工人,也有收银员和存货员(这两种人都来自工人,收银员有耐心,存货员有耐力) 工人(以及收银员/存货员)能够供应冰淇淋。只有收银员才能处理订单,只有存货员才能补充冰激凌(每个冰激凌从80勺开始) 在给定的时间只有一个活跃的出纳/存货人,并且可能有一个出纳/存货人在休息。工人从一个文件(其中每一行都明确说明它是工人、存货人还是出纳)加载到各自的数组列表中(其中有工人的Ar
我想我所困惑的是,我如何与子类的ArrayList交互,并知道在给定时间与哪种类型的子类交互?我知道如何使用instanceOf(),但我觉得它扩展得(没有双关语)更远了?我认为将它们全部放在一个集合中比保留单独的列表更困难 正如您所提到的,找到一个特定类型将是“混乱的”
如果你有很多其他的案例需要重复所有的工作人员,考虑把它们都保留在一个额外的集合中,或者创建一个迭代所有三个列表的方法,您可以重复使用。
我认为将它们全部放在一个集合中比保留单独的列表要困难得多 正如您所提到的,找到一个特定类型将是“混乱的”如果你有很多其他的案例需要重复所有的工作人员,考虑把它们全部保存在一个额外的集合中,仅仅是为了这个目的,或者创建一个迭代所有三个列表的方法,你可以重用。
你可以做一些类似的事情。private void processCashiers(){
List<Cashier> cashiers = new ArrayList<>();
for(Worker w : workers){
if(w instanceof Cashier){
cashiers.add(w);
}
}
// do something with cashierers here
}
private void processCashiers(){
列表出纳=新的ArrayList();
适用于(工人w:工人){
if(带出纳实例){
出纳。添加(w);
}
}
//在这里和收银员做点什么
}
基本上是在本地创建一个指定的列表并对其进行处理。您可以这样做
private void processCashiers(){
List<Cashier> cashiers = new ArrayList<>();
for(Worker w : workers){
if(w instanceof Cashier){
cashiers.add(w);
}
}
// do something with cashierers here
}
private void processCashiers(){
列表出纳=新的ArrayList();
适用于(工人w:工人){
if(带出纳实例){
出纳。添加(w);
}
}
//在这里和收银员做点什么
}
基本上是在本地创建一个指定的列表并对其进行处理。听起来,将它们作为工作人员类型的不同数组/对象进行管理会更容易,而将它们作为员工进行管理则会更容易。Employees不是一个数组,而是一个包含指向所有不同数组的指针的对象,但也可以处理高级任务,并以通用方式在GUI上显示它们。显示它们将按类型分组,除非您需要按其他条件(从文件排序)显示它们,在这种情况下,您可以返回一个(临时?)数组。如果您在GUI上有足够的灵活性,那么可以创建工作类型视图/子视图来处理特定于该对象类型的任何内容。听起来,将它们作为工作类型的不同数组/对象进行管理会更容易,而另一个对象则可以作为员工进行管理。Employees不是一个数组,而是一个包含指向所有不同数组的指针的对象,但也可以处理高级任务,并以通用方式在GUI上显示它们。显示它们将按类型分组,除非您需要按其他条件(从文件排序)显示它们,在这种情况下,您可以返回一个(临时?)数组。如果您在GUI上有足够的灵活性,那么可以创建工作类型视图/子视图来处理特定于该对象类型的任何内容。通常,当您想要调用通用工作操作时,您会遍历一组工作操作(如
getPaid()
或startShift()
)。这些方法的实现可能因特定的类而异(本质上这是多态性),但它们对于所有工作者都是通用的
如果不查看您的代码,您似乎不太可能从调用工作人员集合中的Cashier
或Stocker
特定方法中获益。通常,当您想要调用通用工作人员操作时,您会迭代一组工作人员(如getPaid()
或startShift()
)。这些方法的实现可能因特定的类而异(本质上这是多态性),但它们对于所有工作者都是通用的
如果不查看您的代码,您似乎不太可能从尝试调用出纳
或出纳
特定方法中获益。通常,如果您必须检查特定类型,则设计中的多态性可能会被破坏。这违反了法律