我承认,我犯了过度使用甚至滥用继承的罪过。我上OOP课程时所做的第一个(文字)游戏项目远比“门”和“一扇门的房间”,“两扇门的房间”中的“锁门”和“解锁门”有关,以此类推。
通过最近我从事的(图形)游戏,我认为自己已经学到了教训,并限制了继承的使用。但是我注意到问题很快开始出现。我的根类开始越来越膨胀,而我的叶类中充满了重复的代码。
我以为我还是在做错事,在网上查询之后,我发现我并不是唯一遇到此问题的人。经过一些深入的研究,我最终才发现了实体系统(请参阅:googlefu)
当我开始阅读它时,我能够看到它能够多么清晰地解决我的带有组件的传统OOP层次结构所遇到的问题。这些是一读。当我偶然发现更多……“激进”的ES方法时,例如T-machine上的方法。
我开始不同意他们使用的方法。一个纯粹的组件系统似乎要么过大,要么不直观,这可能是OOP的优势。作者甚至说ES系统与OOP相反,尽管它可以在OOP中使用,但实际上不应该。我并不是说这是错误的,但是我只是觉得自己不想实施一个解决方案。
因此,对我来说,为了解决我在帖子开头所遇到的问题,而又不违背我的直觉,那就是仍然使用层次结构,但是它不会像我以前使用的那样是一个整体的层次结构,而是一种多片的(我找不到与单片相反的单词),它由几棵较小的树组成。
下面的示例说明了我的意思(这受我在《游戏引擎体系结构》第14章中找到的示例的启发)。
我会有一棵小树供车辆。根车辆类别将具有渲染组件,碰撞组件,位置组件等。
然后,坦克(车辆的子类)会从中继承这些组件,并被赋予自己的“加农炮”组件。
角色也是如此。角色将拥有自己的组件,然后让Player类继承它,并被赋予Input控制器,而其他敌人类将从Character类继承并被赋予AI控制器。
我真的看不到这种设计有任何问题。尽管没有使用纯的实体控制器系统,但是冒泡效果的问题和大根类的问题是通过使用多树层次结构解决的,繁重的代码复制叶子的问题也消失了,因为叶子没有有任何代码开始,只有组件。如果需要对叶级别进行更改,则就像更改单个组件一样简单,而不是将代码复制粘贴到任何地方。
当然,像我一样没有经验的人,当我刚开始使用单一层次结构,繁重的继承模型时,我没有看到任何问题,因此,如果我当前正在考虑实现的模型存在问题,我不会能够看到它。
您的意见?
PS:我正在使用Java,因此无法使用多重继承来实现此功能,而不是使用常规组件。
PPS:组件间通信将通过相互链接相关的组件来完成。这将导致耦合,但是我认为这是一个不错的权衡。