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