Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在概念上添加多态性?_Java_Arraylist_Polymorphism - Fatal编程技术网

Java 如何在概念上添加多态性?

Java 如何在概念上添加多态性?,java,arraylist,polymorphism,Java,Arraylist,Polymorphism,我有一个小组项目,它涉及一个Java程序,用于模拟冰淇淋店,并将其转换为GUI应用程序 这家商店预装了16种不同的冰淇淋。商店里有工人,也有收银员和存货员(这两种人都来自工人,收银员有耐心,存货员有耐力) 工人(以及收银员/存货员)能够供应冰淇淋。只有收银员才能处理订单,只有存货员才能补充冰激凌(每个冰激凌从80勺开始) 在给定的时间只有一个活跃的出纳/存货人,并且可能有一个出纳/存货人在休息。工人从一个文件(其中每一行都明确说明它是工人、存货人还是出纳)加载到各自的数组列表中(其中有工人的Ar

我有一个小组项目,它涉及一个Java程序,用于模拟冰淇淋店,并将其转换为GUI应用程序

这家商店预装了16种不同的冰淇淋。商店里有工人,也有收银员和存货员(这两种人都来自工人,收银员有耐心,存货员有耐力)

工人(以及收银员/存货员)能够供应冰淇淋。只有收银员才能处理订单,只有存货员才能补充冰激凌(每个冰激凌从80勺开始)

在给定的时间只有一个活跃的出纳/存货人,并且可能有一个出纳/存货人在休息。工人从一个文件(其中每一行都明确说明它是工人、存货人还是出纳)加载到各自的数组列表中(其中有工人的ArrayList、存货人的ArrayList和出纳的ArrayList)

我现在发现将其转换为GUI非常复杂,需要处理3个ArrayList。我想更改项目以将所有Worker保存到一个Worker类型的ArrayList中。但是,车间内的许多操作已经在假设三个不同的ArrayList的情况下定义/执行

更改代码以将整个Worker文件加载到一个Worker类型的ArrayList很简单。但是,如何在概念上更改商店的其余功能以使用一个ArrayList

例如,如果我想将商店的活动出纳设置为Bill,我如何导航ArrayList以仅查找出纳,然后查找Bill,然后将其设置为活动


我想我所困惑的是,我如何与子类的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()
)。这些方法的实现可能因特定的类而异(本质上这是多态性),但它们对于所有
工作者都是通用的


如果不查看您的代码,您似乎不太可能从尝试调用
出纳
出纳
特定方法中获益。通常,如果您必须检查特定类型,则设计中的多态性可能会被破坏。这违反了法律