14.1 Deck和手里的牌

要实现这款游戏,需要表示整副牌、弃牌堆、储备牌以及每个人手中的牌;还需要能够发牌、取牌和出牌。

前一章的 Deck 类可满足上述部分需求,但存在两个问题。

  • 一手牌和一堆牌的规模不同,且它们的规模会随游戏的进行而不断变化。前一章的 Deck 类的实现使用了一个 Card 数组,而数组的长度是固定的。

  • 不知道用 Deck 对象表示一手牌和一堆牌是否合适。我们可能需要创建新类来表示其他的扑克牌集合。

为解决第一个问题,可用 java.util 包中的 ArrayList 替换 Card 数组。ArrayList 是一种集合(collection),即包含其他对象的对象。

Java 类库提供了各种集合,就这里的目标而言,ArrayList 是不错的选择,因为它能自动增大和缩小,还提供了添加和删除元素的方法。

为解决第二个问题,可用一种名为继承(inheritance)的语言功能。我们将定义一个新类——CardCollection,用于表示扑克牌集合,再将 DeckHand 定义为 CardCollection 的子类。

子类(subclass)是“扩展”已有类的新类,即它拥有已有类的所有属性和方法,还新增了属性和方法。稍后将介绍详情,我们先来定义 CardCollection 类。