Rud*_*udi 5 oop collision-detection
我在OO设计中遇到问题,我最终在2个不同的类中重复了代码.这是发生了什么:
在这个例子中,我想检测游戏对象之间的碰撞.
我有一个基本CollisionObject,它包含扩展基类的常用方法(如checkForCollisionWith)和CollisionObjectBox,CollisionObjectCircle,CollisionObjectPolygon.
这部分设计似乎没问题,但这就是令我不安的问题:打电话
aCircle checkForCollisionWith: aBox
Run Code Online (Sandbox Code Playgroud)
将在Circle子类内执行圆形与盒子碰撞检查.相反,
aBox checkForCollisionWith: aCircle
Run Code Online (Sandbox Code Playgroud)
将在Box子类中执行box vs circle collision check.
这里的问题是Circle vs Box碰撞代码是重复的,因为它在Box和Circle类中.有没有办法避免这种情况,或者我是否以错误的方式处理这个问题?现在,我倾向于使用包含所有重复代码的辅助类,并从aCircle和aBox对象调用它以避免重复.不过,我很好奇是否有更优雅的OO解决方案.
我遇到了同样的问题(在 Objective C 中工作),我找到的解决方法是在我已经知道两个对象的类型时定义一个外部函数来解决冲突。
例如,如果我有矩形和圆形,它们都实现了协议(该语言的一种接口)形状..
@protocol Shape
-(BOOL) intersects:(id<Shape>) anotherShape;
-(BOOL) intersectsWithCircle:(Circle*) aCircle;
-(BOOL) intersectsWithRectangle:(Rectangle*) aRectangle;
@end
Run Code Online (Sandbox Code Playgroud)
为 Rectangle 定义 intersectsWithCircle,为 Circle 定义 intersectsWithRectangle,如下所示
-(BOOL) intersectsWithCircle:(Circle*) aCircle
{
return CircleAndRectangleCollision(aCircle, self);
}
Run Code Online (Sandbox Code Playgroud)
和 ...
-(BOOL) intersectsWithRectangle:(Rectangle*) aRectangle
{
return CircleAndRectangleCollision(self, aRectangle);
}
Run Code Online (Sandbox Code Playgroud)
当然它并没有解决Double Dispatch的耦合问题,但至少避免了代码重复