我正在分析图形基元(矩形、直线、圆形等)的交互并计算重叠、相对方向、合并等。这被引用为双重调度的一个主要示例(例如维基百科 http://en.wikipedia.org/wiki/Double_dispatch)
自适应碰撞算法通常要求
不同的对象有不同的处理方式。一个典型的例子是
在一个宇宙飞船与一个物体发生碰撞的游戏环境中
小行星的计算方式与小行星之间的碰撞不同
宇宙飞船和空间站。1 http://en.wikipedia.org/wiki/Double_dispatch
但我还没有理解主要的解释,而且我一般也不理解SO上的答案。
我当前的代码(Java)使用超类 Shape ,类似于:
for (int i = 0; i < shapes.size() - 1; i++) {
for (int j = i + 1; j < shapes.size(); j++) {
Shape shape = shapes.get(i).intersectionWith(shapes.get(j));
}
}
在子类(此处为 Rect)中具有特定的实现,例如
public class Rect extends Shape {
public Shape intersectionWith(Shape shape) {
if (shape instanceof Rect) {
return this.getCommonBoundingBox((Rect)shape);
} else if (shape instanceof Line) {
return this.intersection((Line)shape);
} else if (shape instanceof Text) {
return this.intersection((Text) shape);
}
}
}
我必须写下所有的n*(n-1)/2
无论如何方法(并且已经这样做了)。我还必须有可扩展的代码以适应(比如说)以后的情况:
} else if (shape instanceof Circle) {
return this.intersection((Circle)shape);
我不知道如何使用双分派模式,也不知道它的价值,并且希望有一个使用 Java 图形原语或类似伪代码的具体示例。
更新:我已经接受@Flavio,因为(我认为)它回答了所提出的确切问题。然而,我实际上已经实现了@Slanec,因为它解决了我的问题,并且(对我来说)更简单、更容易阅读。我有一个附属问题“解决方案是否取决于对称关系?”。
“A 与 B 相交”通常与“B 与 A 相交”相同,但“A 与 B 碰撞”并不总是与“B 与 A 碰撞”相同。 (A == 汽车,B == 骑自行车的人)。可以想象,我的交集在未来可能不对称(例如“矩形部分遮盖圆”不是对称的,并且可能具有不同的语义。
@Flavio 很好地解决了维护问题,并指出编译器可以检查问题。 @Slanec 通过反射来做到这一点,看起来好像它是一个有用的维护辅助工具 - 我不知道性能受到什么影响。