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