如何创建使用继承它的类的接口?C++/CLI游戏对象类设计疑问
嘿,我来帮你梳理这个GameObject类的设计问题~先把你给出的代码规整成清晰的格式:
public ref class GameObject : GameObjectBluePrint { public: property double health; property double damage; property double defense; property double strideLength; property System::Drawing::Point location; public: virtual void Attack(GameObject% enemy) { enemy.health -= this->damage; } virtual void Defend(GameObject% enemy) { this->health -= enemy.damage * 0.5; } // 其他virtual方法... };
结合练习场景,这里几个常见的设计痛点可以聊聊:
- 继承关系的合理性:GameObject直接继承GameObjectBluePrint,得先明确这个基类的职责——如果BluePrint是用来存“模板配置”(比如初始属性值)的,那用组合而非继承会更灵活,避免把配置逻辑和对象行为强绑定,后续换模板也不用改继承链。
- 硬编码的行为逻辑:Attack里直接扣减damage、Defend里固定乘0.5的逻辑太死板了。比如后续要做坦克(防御系数更高)、法师(伤害带魔法加成),只能靠重写方法,会导致大量重复代码。不如把这些计算逻辑抽成可配置的属性(比如
defenseMultiplier),甚至用策略模式,把攻击/防御逻辑做成独立的策略类,让GameObject动态挂载不同策略。 - 封装性不足:现在所有属性都是public的property,外部代码可以直接修改
health、damage,完全绕过了Attack/Defend这些行为方法,很容易出现逻辑漏洞。建议把字段设为private,只暴露必要的getter,setter只给内部或特定方法调用(比如Heal方法才能改health)。 - 扩展性受限的多态:虽然Attack和Defend是virtual,但如果后续要加Heal、Dash、SkillCast这些新行为,每次都得在基类加virtual方法,违反开放封闭原则。试试组件模式吧——把每个行为拆成独立的Component(比如AttackComponent、DefendComponent、MoveComponent),GameObject负责组合这些组件,需要什么功能就加对应的组件,扩展性强多了。
内容的提问来源于stack exchange,提问作者user1939991
相关产品推荐
相关产品推荐

