请考虑以下内容:
有abstract class Collider
和其他一些扩展该类的类,例如RectCollider
和CircleCollider
。
它们的多个实例都在同一List<Collider> colliders
中。
现在,我的问题是我应该如何检查这些对撞机之间的碰撞,同时保持它们之间的兼容性。例如,我要检查RectCollider
和另一个RectCollider
之间的冲突,而不是检查RectCollider
和CircleCollider
。
到目前为止,我的想法是使用一种方法(通过instanceof)检查对撞机属于哪种类型,然后根据结果调用不同的方法:
public Collision getCollision(Collider a, Collider b) {
if(a instanceof RectCollider) {
if (b instanceof CircleCollider) {
return rectCircle(a, b);
}
else if (b instance of RectCollider) {
return rectRect(a, b);
}
}
else if(a instanceof CirlceCollider) {
if (b instanceof CircleCollider) {
return cirlceCircle(a, b);
}
else if (b instance of RectCollider) {
return rectCircle(b, a);
}
}
else {
return null;
}
}
此方法的当前调用方式:
getCollision(colliders.get(i), colliders.get(i+1));
但是,我不确定这是否是最快/最好的方法,因为当添加更多对撞机类型时,该方法会变得非常复杂。
答案 0 :(得分:0)
这样,当您添加新的子类时,方法大小将按平方缩放。是否可以简单地做到这一点,取决于要调用的方法(rectRect,rectCircle等)。
所有这些方法都是不相关的吗,还是每个形状相同的方法都具有共同的行为?在前一种情况下,您不走运。在后一种情况下,您可能想在Collider的子类中定义此行为,并添加提取该行为的常规方法。这样的大小可以是固定的,例如:
public Collision getCollision(Collider a, Collider b) {
Force f1 = a.getCollisionInfo();
Force f2 = b.getCollisionInfo();
return new Collision(f1, f2);
}
关于执行性能,没关系。 JVM为您优化了所有功能。