【发布时间】:2011-11-12 06:02:12
【问题描述】:
我的游戏有
class Enemy
我可以改变谁的人工智能/功能
trait Moving
trait VerticalMover extends Moving
trait RandomMover extends Moving
等等。现在我需要根据特征获取预加载的东西。我想做的是有一个 Map 接受所有扩展 Moving 作为键的特征,然后是一些 EnemyContainer 作为值,将预加载特征相关的内容。
但是我如何定义这样的 Map 以及如何格式化我的 .get() 以通过某个 Enemy 的实例获取容器。比如:
val myEnemy = new Enemy with RandomMover
val myDetails:EnemyContainer = enemyDetailsStore.get(myEnemy.getClass)
【问题讨论】:
-
你的意思是你想让
enemyDetailsStore在myEnemy扩展VerticalMover时返回一件事,如果它扩展RandomMover则返回另一件事?如果两者都扩展呢? -
是的,我就是这个意思。但我开始怀疑我的整个想法是否合理。也许我应该在特征中嵌入一些关键字符串并将其用作关键。因此,通过 trait 线性化,最后一个覆盖 trait 将设置 EnemyContainer,换句话说就是用于显示敌人的纹理。
-
大多数时候,特征/接口的意义在于说“我知道怎么做 X”,同时允许 X 的不同实现。其他细节,我认为最自然的设计是让
Moving特征直接在其上具有某种getMovingStrategy或move方法,您可以在垂直和随机移动子特征中相应地实现。