首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >软件设计:这里推荐避免切片/类型擦除的方法。

软件设计:这里推荐避免切片/类型擦除的方法。
EN

Software Engineering用户
提问于 2016-01-18 21:51:38
回答 1查看 264关注 0票数 7

这里有一个具体的最低限度的例子来阐述我的问题:

在小球类游戏中,你有一个物理引擎来定期移动物体:

代码语言:javascript
复制
void move(set< PhysicalObject* > objets, Duration t)

当发生冲突时,该引擎可以使用用户定义的行为(使用策略类)。例如,默认策略是更新对象方向,但是您可以为它提供一个自定义策略类,该类根据某些特定规则杀死对象。

代码语言:javascript
复制
void update_after_collision(DerivedObject* a, DerivedObject* b)

为了在冲突期间实现新行为,我有一些特定的派生类(它们具有与其生命周期相对应的附加属性/方法,等等)。

的问题是:引擎调用update_after_collision策略,因此,如果不使用访问者模式或类型强制转换,则无法使用派生类即此策略。请注意,引擎只知道基类,而不知道派生类。

有什么办法可以避免吗?标准的方法是什么?

对于这种特殊情况,另一种编程模式更好吗?

编辑:代码用C++编写

EN

回答 1

Software Engineering用户

发布于 2016-01-18 22:40:36

这里有一个运行时多分派的典型用例,根据您打算使用的实际面向对象语言,这要么是内置的,要么需要一些工作。很抱歉,这个答案不能更精确,但这在很大程度上取决于实际的编程语言。

假设一种Java-esque语言,您可以快速地设计一种自定义分派方法:一种枚举类型中的“类”的简单组织结构一开始就足够了,并且非常容易修改。每个对象都有一个类型标记,指示它属于哪种类型。

您的碰撞方法可以保存每个类型组合的专用回调的平方矩阵。在伪码中:

代码语言:javascript
复制
collisions[from.tag][to.tag]

..。引用您需要使用给定的fromto对象调用的方法。您可以扩展您的标记集,但这需要重新编译阶段。但是,如果需要,可以在调试时将标记绑定到有效的方法。

如果您想引入继承,这就会涉及到更多的问题:假设标记T ( collisions矩阵中的一个空单元格)没有特定的方法,那么您应该回到它的父类型P(T) (假设单继承)。为此,您可以在每个枚举值中都有一个parent成员。

对于C++,请看一下Stroustrup等人的C++的开放多方法

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/307729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档