2014-04-08 32 views
0

我正在设计一种物理模拟器,其中包含三种可能会发生碰撞的物体。多态性重载

最基本的[摘要]类被称为Item其中包含有关质量,位置&速度的信息。

还有其他3种类型:CircleBoundary & Photon其扩展Item类,并有自己的属性。

我有一个名为List<Item>其中system包含各种CirclesBoundaries等我去通过这个列表使用的方法来检查碰撞:system.get(i).collide(system.get(j));这个编辑速度等

我的问题是, Eclipse希望我在CircleBoundary ...类别collide(Item itemName)的每一个中都有一个方法,但是通过这样做,编译器将无法以不同方式处理每种类型的项目。

我现在有在CircleBoundary ...类不同的方法,如:

collide(Circle c){..} 
collide(Boundary b){..} 
collide(Photon p){..} 

但是,编译想要一个普通collide(Item i)方法。

我该如何满足编译器的要求,但仍然按照我的方式继承不同类型的碰撞?

+3

'system.get(我)'返回'Item' ,编译器无法知道它是圆形,边界还是光子。因此,“碰撞”方法必须采用“Item”参数。 – sp00m

+1

我建议真正需要回答的问题是*为什么你需要首先使用不同版本的方法*? – JonK

回答

2

,您仍然可以使用collide(Item i)

但是如果你想方法采取不同的行动为每个超类,你可以这样做:

public void collide(Item i) { 

    if(i instanceof Circle) { 
     //do something for a circle 
    } else if(i instanceof Photon) { 
     //do something for a photon 
    } else if(i instanceof Boundary) { 
     //do something for a boundary 
    } 
} 
1

您可以简单地保留collide(Item b){..}或类似collide(<? extends Item> b){..}。如果你打算通过子类型,你也可以在这里引入泛型概念。 这将提供更多关于它的信息。 http://www.thejavageek.com/tag/generics/

+0

你能举个例子吗? – Edd

+0

@chairharrison,kiruwka提供了一个更简单的解决方案:)你可以参考它,如果你想研究泛型,那么你可以研究我提供的链接 –

3

您应该为每个子类覆盖collide(Item i)。你可以检查item类型中的每个执行,例如,在你的Photon类:

@Override 
public void collide(Item item) { 
    if (item instanceof Photon) { 
     // implement collision of this with (Photon) item 
    } else if ... { 
     // I wonder how collision of Photon with Circle would look like :) 
    } 
} 

这是非常类似的方法来重写对象的新类型equals方法。