Oop 如何在复杂的纸牌游戏中平衡多态性/继承性/类型数据架构与原型/轻量级模式的技巧?

Oop 如何在复杂的纸牌游戏中平衡多态性/继承性/类型数据架构与原型/轻量级模式的技巧?,oop,inheritance,kotlin,architecture,polymorphism,Oop,Inheritance,Kotlin,Architecture,Polymorphism,我正试图用Kotlin开发一款纸牌游戏,但我觉得我必须做出的复杂架构决策正在阻碍我的进程。 我想创建一个坚实的和灵活的基础,为潜在的几十个不同的牌,不同的效果,不同类型(例如,拼写,车辆,武器…)。 直觉上,我觉得给每一张不同的卡它自己的子类是荒谬的,原因有几个,比如失去灵活性(不能(没有疯狂的黑客)动态地创建新的卡)和不断升级的复杂性 另一方面,会有不同类别的卡牌(类型),它们之间通常比卡牌有更多的共同点-因此我觉得我应该明确地将卡子类化,因为否则我将得到类型枚举(法术、武器、车辆…)丑陋的s

我正试图用Kotlin开发一款纸牌游戏,但我觉得我必须做出的复杂架构决策正在阻碍我的进程。 我想创建一个坚实的和灵活的基础,为潜在的几十个不同的牌,不同的效果,不同类型(例如,拼写,车辆,武器…)。 直觉上,我觉得给每一张不同的
它自己的子类是荒谬的,原因有几个,比如失去灵活性(不能(没有疯狂的黑客)动态地创建新的卡)和不断升级的复杂性

另一方面,会有不同类别的卡牌(类型),它们之间通常比卡牌有更多的共同点-因此我觉得我应该明确地将
卡子类化
,因为否则我将得到类型枚举(法术、武器、车辆…)丑陋的switch语句取代了通常由继承和多态性处理的语句

起初,我在设想如何访问生活在超类集合中的子类的特定行为时遇到了问题,但现在我明白了如何使用访问者模式来解决这个问题——到目前为止一切都很好

我现在的问题是,这种建筑方法似乎与我计划的其他事物相冲突,我认为这是必要的,至少是非常值得的: 原型飞锤模式的混合: 我已经创建了一个可以复制的原型卡片的“百科全书”。卡由共享静态部分和唯一动态部分组成:

当然,我希望以以下方式创建标识组件的子实例:

不管我怎么做,似乎都不可能以令人满意的方式做到这一点。有很多解决方案,但在我看来都是软弱的妥协:

  • 按照我描述的方式来做意味着子类必须保存 对其组件的多次引用;一个基类和一个子类 每人一个。这也导致了一种丑陋的情况,即 属性分布在几个组件类上,所有组件类都依赖于 彼此
  • 使用接口而不是继承会导致大量代码重复
  • 子类化仅仅是组件而不是卡本身隐藏了卡内部的类型信息,并且还需要丑陋的反射 用于访问子类特征
  • 实现与类型信息等效的数据,而不是子类化,以规避Kotlin继承的限制规则 层次结构似乎很粗糙,并且删除了IDE支持
我确信在过去的两周里,我考虑了更多的方法,但这些都是我现在所能记得的

我知道你可能需要更完整的信息来说明我计划做什么,以给我具体的答案,但因为这太复杂了,我也不知道这是怎么回事,我对“考虑这个”或“不管你在做什么”的粗略想法感到满意,对于如何处理这样一个“设计难题”,远离这个或一般性的建议,因为事情看起来如此复杂,以至于你不知道如何开始

当然,如果有必要的话,我准备对我的描述进行详细阐述。

在这里思考一下

如何创建一个包含卡片低级公共部分的BaseCard类,然后为从BaseCard继承的每个类别创建一个类,命名为like category,在其中存储每个类别公共部分,然后为从其各自类别继承的某个类型的CardClass创建一个类呢。所以,在某一类型的卡片中,您继承了任何一个类的相关内容,只需添加某一类型的新卡片即可扩展您的集合


关于哪些数据是特定于实例的或在类中共享的,这与此以及每个类的实现细节是正交的。

我几乎还有一天来考虑这个问题,我开始觉得我应该朝着与您刚才描述的类似的方向走。关于共享和特定状态的正交性。。。我不能使用“真实”静态属性,因为这意味着我必须为基本上每一张卡创建一个新类,因为每一张卡都主要由“共享状态”组成。如果你想一想纸牌游戏通常是什么样子,这很有道理:同名的纸牌往往是彼此的副本,不同之处在于位置或标记等修改。flyweight/prototype看起来也适用。现在必须尝试一下。我最终会更新这个问题。谢谢你的回复!