目前,我已经为我创建的方法提供了以下代码:
public boolean overlaps(CollisionBody2D collider)
{
//other method code
if (collider instanceof ArcBody2D)
return this.overlaps((ArcBody2D) collider);
else if (collider instanceof CircleBody2D)
return this.overlaps((CircleBody2D) collider);
else if (collider instanceof PointBody2D)
return this.overlaps((PointBody2D) collider);
else if (collider instanceof LineBody2D)
return this.overlaps((LineBody2D) collider);
else if (collider instanceof BoxBody2D)
return this.overlaps((BoxBody2D) collider);
return false;
}
每个ArcBody2D等都是CollisionBody2D的子类,并为每个其他类型(ArcBody2D等)定义了碰撞的方法。我想用一般的转换来替换eyeore if if语句(如果是instanceof)...到正确的子类类型,这样我就不必继续增加if语句,因为我添加了更多的碰撞器类型。
理想情况下,我正在努力实现以下目标:
return this.overlaps((collider.subclassType()) collider);
我尝试过使用泛型,但问题是它要求你预定义类类型,这对我来说并不是很有用,因为我需要一个处理碰撞的方法,而不需要预定义CollisionBody2D的类型。调用。例如:
BoxBody2D box = new BoxBody2D(parameters);
CollisionBody2D colliders [];
//populate array
for (CollisionBody2D c: colliders)
{
if (box.overlaps(c))
//do something
}
我尝试过使用泛型,但问题是它们仍然需要您在调用方法时定义类型。除了这个长篇大论之外,还有其他方法可以达到这个目的吗?
答案 0 :(得分:0)
我相信你可以做一些事情 (省略例外处理)
public boolean overlaps(CollisionBody2D collider)
{
Class c = collider.getClass();
return this.overlaps( c.cast( collider) );
}
答案 1 :(得分:0)
我认为这听起来像是设计问题。
为什么不使用界面而不是类?
public boolean overlaps(Collidable collider) {
return collider.overlaps(this);
}
您需要一个看起来像这样的新界面:
public interface Collidable {
boolean overlaps(Collidable collider);
}
你可以使用“同类对撞机”或任何你需要的东西:
public class SameClassCollider implements Collidable {
@Override
public boolean overlaps(Collidable collider) {
return (collider instanceof this.getClass());
}
}
我主要建议使用Strategy pattern。您可能还想查看Decorator pattern,以防您可能想要建立更加柔和的碰撞。
答案 2 :(得分:0)
以下是您必须遵循的步骤(机制)。我已经使用泛型方法来实现这一点。步骤如下。
将“重叠”方法设为如下通用方法:
public boolean overlapps(T t){ //你的代码 }
最后,在方法中,您可以将其称为:
new CollisionBody2D.overlaps(new ArcBody2D());
所以,你不需要施放或任何东西,它将调用CollisionBody2D类中的重叠方法。但是,如果你需要运行你传递的对象的重叠方法,我建议你使用运行时的polimorphism并继续相应,但至于你上面的问题我不认为你有这样的要求,而不是调用重叠你引用的类的方法。