背景
这是我正在研究的实际问题:我想要一种在纸牌游戏“ 魔术:聚会”中表示纸牌的方法。游戏中的大多数卡都是外观正常的卡,但其中有些分为两部分,每部分都有自己的名称。这些分为两部分的卡的每半都被视为卡本身。因此,为清楚起见,我将Card
仅指代普通卡或两部分卡的一半(换句话说,只有一个名字的东西)。
因此,我们有一个基本类型Card。这些对象的目的实际上只是为了保留卡的属性。他们自己根本不做任何事情。
interface Card {
String name();
String text();
// etc
}
Card
我称之为的两个子类PartialCard
(两部分的卡的一半)和WholeCard
(普通卡)。 PartialCard
还有两个附加方法:PartialCard otherPart()
和boolean isFirstPart()
。
代表
如果我有一个牌组,它应该由WholeCard
s而不是Card
s组成,因为a Card
可能是a PartialCard
,这没有任何意义。因此,我想要一个表示“物理卡”的对象,即可以表示一个WholeCard
或两个PartialCard
s的对象。我暂时称呼这种类型Representative
,并Card
有方法getRepresentative()
。A Representative
几乎不会在其代表的卡上提供任何直接信息,而只会指向它/它们。现在,我的聪明/疯狂/愚蠢的想法(由您决定)是WholeCard继承自两个 Card
和Representative
。毕竟,它们是代表自己的卡片!WholeCards可以实现getRepresentative
为return this;
。
至于PartialCards
,它们并不代表自己,但是它们的外部Representative
不是Card
,而是提供了访问这两个PartialCard
的方法。
我认为这种类型的层次结构很有意义,但是很复杂。如果我们将Card
s视为“概念卡”而将Representative
s视为“物理卡”,那么,大多数卡都是!我认为您可以提出一个论点,即物理卡实际上包含概念卡,并且它们不是一回事,但我认为它们是相同的。
类型转换的必要性
因为PartialCard
s和WholeCards
都是Card
s,通常没有充分的理由将它们分开,所以我通常只使用Collection<Card>
。所以有时我需要转换PartialCard
s才能访问它们的其他方法。现在,我正在使用此处描述的系统,因为我真的不喜欢显式强制转换。和一样Card
,Representative
需要将其强制转换为WholeCard
或Composite
,以访问Card
它们所代表的实际。
所以仅作总结:
- 基本类型
Representative
- 基本类型
Card
- 类型
WholeCard extends Card, Representative
(无需访问,它代表自己) - 类型
PartialCard extends Card
(允许访问其他部分) - 类型
Composite extends Representative
(允许访问两个部分)
这是疯了吗?我认为这实际上很有意义,但是老实说我不确定。