c – 使用多重继承来实现实体 – 组件编程
我已经阅读了一些关于实体 – 组件编程风格的文章.提出的常见问题之一是如何表达组件之间的依赖关系,以及与同一实体相关的组件如何通信.
在我看来,这个问题的一个简单的解决方案是使每个依赖项成为其依赖的虚拟基类. 这样,当组件包含在实体中时(通过虚拟继承),所有依赖组件只包含一次.此外,组件所依赖的所有功能都将在其成员函数中提供. class C_RigidBody : public virtual C_Transform { public void tick(float dt); }; class C_Explodes : public virtual C_Transform { public void explode(); }; class E_Grenade : public virtual C_RigidBody,public virtual C_Explodes { //no members }; 有没有人这样做? (我意识到由于“钻石问题”,多重继承通常不受欢迎,但这个问题无论如何都是组件必须处理的问题.(想象一下,有多少组件将取决于实体在游戏世界中的位置)) 解决方法
我最近也和你提出了同样的想法.
从理论上讲,我认为如果适当应用,这种方法是依赖逆的完美解决方案.否则你会搞砸了. 回顾DIP所说的内容:
请参阅以下代码示例 struct IClockService { virtual unsigned timestamp() = 0; }; struct ITimingService { virtual unsigned timing(std::function<void()> f) = 0; }; struct ClockService : public virtual IClockService // public virtual means implement { virtual unsigned timestamp() { return std::time(nullptr); } }; struct TimingService : public virtual ITimingService,private virtual IClockService // private virtual means dependency { virtual unsigned timing(std::function<void()> f) { auto begin = timestamp(); f(); return timestamp() - begin; } }; class Application : public ClockService,public TimingService { }; Application a; unsigned runingTime = a.timing(anyFunction); 在上面的例子中. ClockService和TiminigService是两个模块,它们不需要彼此了解,只需要接口IClockService和ITimingService.应用程序将两个模块组合在一起. 结论: > Map依赖于私有虚拟继承,否则会破坏Liskov-Subtitution Principle 我只在我的玩具项目中应用这样的习语.承担风险自负. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 依赖注入 – 如何在Ninject 2中使用Common Service Locator
- Part V. 数据访问-21. 使用O/X Mappers编组XML-21.5 JAXB
- 获取attr属性的值和getDimension方法获取到资源文件中定义的
- 定时ajax获取日志(easyui滚动条+js)
- c – 安腾ABI在多大程度上真正指定了填充和对齐?
- 正则表达式 – 如何用空格分隔数千
- FLEX4实践—DataGrid嵌入ItemRender
- 测试 – 如何决定何时以及何时不创建集成测试
- ruby-on-rails – 是否可以为在params中传递的提交按钮添加
- CODEGEN: 参数“GetDataResult”需要其他方案信息,使用参数