我正在分析图形基元(矩形、直线、圆形等)的交互,并计算重叠、相对方向、合并等。这被引用为 Double Dispatch 的主要示例(例如Wikipedia)
自适应碰撞算法通常要求以不同方式处理不同对象之间的碰撞。一个典型的例子是在游戏环境中,宇宙飞船和小行星之间的碰撞与宇宙飞船和空间站之间的碰撞的计算方式不同。1
但我还没有理解主要的解释,我也一般不理解关于 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 通过反射来做到这一点,这看起来像是一种有用的维护辅助工具——我不知道性能损失是什么。