2014-10-29 77 views
-2

我想要创建将包含各种对象的Object数组的World类。对象java中的各种对象

public class World { 
    Object obj[] = new Object[10]; 

    public void World() { 
     this.obj[0] = new Sphere(); 
     this.obj[1] = new Triangle(); 

     ... and so on 
    } 
} 

然后在主:

World world = new World(); 

我想使用那些inclass特定对象的methots。

例如

world.obj[i].methodOfSphere(); 

我该如何做到这一点?

+1

你的设计非常脆弱,充满危险。为什么这个设计?你的问题是经典的[XY问题](http://mywiki.wooledge.org/XyProblem),你问我该如何解决X代码问题,其中真正的解决方案是忘记X而代之以Y,在那里你以完全不同的方式做事。告诉我们更多关于你想要解决的总体问题,而不是你想如何解决问题,我们可能会给你一个更清洁和更好的解决方案。 – 2014-10-29 21:52:05

+0

因为'obj'是一个'Object []',所以你会这么做(casts和'instanceof')。如果你想持有一个特定的对象,你应该在你的数组中进行。 – Makoto 2014-10-29 21:52:13

+3

如果'Sphere'和'Triangle'实现了一个*形状*接口,则将该类型用作数组。例如'MyShapeIfc []'。如果这不是关于如何使用数组的分配,请改用List。收藏对于这类事情更好。 – 2014-10-29 21:54:44

回答

2

正如诚已经评论,你可以用instanceof验证,然后做一个cast ...

if(world.obj[i] instanceof Sphere) 
    ((Sphere)world.obj[i]).methodOfSphere(); 

然而,这是不冷静。

你应该考虑阅读interface为您创造一个形状behaviour,并覆盖在实施方法...

public interface Shape 
{ 
    methodSpecificToAllShape(); 
    method2SpecificToAllShape(); 
} 


public class Sphere implements Shape 
{ 
    @Override 
    methodSpecificToAllShape() 
    { 
     //... 
    } 

    @Override 
    method2SpecificToAllShape() 
    { 
     //... 
    } 

    /* 
    * It does not stop you from adding method for a specific shape 
    */ 
    public void method3SpecificToSphere() 
    { 
     //... 
    } 
} 

这样做,你声明你的对象为Shape,然后不同的方法将被要求正确的实施,而不必做演员。

Shape triangle = new Triangle(); 
Shape sphere = new Sphere(); 

triangle.methodSpecifictoAllShape(); 
sphere.methodSpecificToAllShape(); 

并且将根据实例执行特定于每个形状的方法。

+0

这是要走的路。 – 2014-10-29 22:03:41

+0

好吧,但在循环中,我必须知道它的球体或三角形,所以我必须通过instanceof检查Shape是三角形还是球体。这是为了raytracer。对于每条射线,我必须检查它是否碰到三角形或球体。 (顺便说一句) – keid 2014-10-29 22:06:44

+0

你可以用'instanceof'检查那是真的。然而,你应该仍然使用'interface' +'implements'来检查'Object'的''instance''在任何地方都会变得痛苦不堪。您还应该使用接口,因为将实际上明显是Shape的Object声明为“Object”并不具有代表性。这个关键字不是没有,但我尽量避免它。 – 2014-10-29 22:13:36