如何从概念上添加多态?

时间:2015-11-13 13:19:43

标签: java arraylist polymorphism

我有一个小组项目涉及使用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(),但我觉得它比那更广泛地延伸(没有双关语)?

4 个答案:

答案 0 :(得分:3)

通常,当您要调用通用Worker操作(例如getPaid()startShift())时,您将迭代一组Worker。这些的实现可能根据特定的类(这实质上是多态)而有所不同,但它们对于所有Workers都是通用的。

如果不查看您的代码,您似乎不太可能从尝试从工作集合中调用CashierStocker特定方法中获益。

答案 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的灵活性,请使工作者类型视图/子视图可以处理特定于该对象类型的任何内容。