0

想象以下场景:

  • 我有一个基类,比如说 Fruit,还有一些子类,如 Apples、Oranges 等。
  • 我还有一个 Person 类,里面有各种水果的清单。在这种情况下,我只关心这个人每种水果有多少。让每一片 Fruit 都成为一个对象是没有意义的。
  • 我还应该能够从这个人的库存中取出一块水果,然后有一个实例化的对象。
  • Fruit 应该具有我可以分配的内在顺序,以便可以从多个类中以类似的方式列出它。苹果总是先于橙子等。

当我谈论人的库存中的水果时,我希望能够以静态的方式引用它。如int n = person.getPiecesofFruit(Apple);. 但是当我从一个人的库存中删除它时,我需要将水果作为一个对象,如Apple a = person.removeOne(Apple);.

实现这一点的明显方法似乎是让 Fruit 的每个子类都有一个静态 ID 字段,所以我可以写int n = person.getPiecesofFruit(Apple.ID);

这允许 Person 简单地包含一个整数数组,其中每个 Fruit 的 ID 对应于其计数所在的索引:

int[] fruitCounts = new int[Fruit.numberOfFruits()];

public int getPiecesOfFruit(int id) { return fruitCounts[id]; }
public int addFruit(int id, int count) { fruitCounts[id] += count; }

问题是维护唯一的有序 ​​id(理想情况下,id 应该是连续的)。如果我删除了 Orange 类,我是否必须重新分配所有其他 Fruit 的 id?或者如果我在 Apple 和 Orange 之间插入 Pear,我也会遇到同样的问题。我可以使用链表方法并拥有Apple.ID = Orange.ID + 1;等,这将维持秩序,除非我搞砸了,让 Orange 和 Pear 都意外地出现在 Apple 之后。本质上,我想将枚举的有序列表功能与类的继承和 OO 特性结合起来。有人可以告诉我是否有一种通常可以完成的方法。

我希望这个问题对 SO 来说不是太开放,但这是我在各种场景中遇到的问题,所以我希望有一个有点标准化的解决方案。

4

1 回答 1

5

在我看来,你真的需要一个Fruit枚举,带有 values APPLE, ORANGE, PEAR. Java 中的枚举是成熟的类;他们可以有字段和方法。这样,您可以使用 add() 和subtract() 方法将计数存储在每种水果类型中。每次调用时person.add(Fruit f),都会在该方法中调用f.add(),每次调用时person.remove(Fruit f),都会调用f.subtract()

这也可以让您完全回避排序问题——枚举基于它们的声明有一个非常简单定义的排序。

于 2013-06-27T19:46:17.580 回答