2012-04-07 69 views
0

我想问一下,如果有写下面的代码更优雅的方式:爪哇 - 多态性与集合属性

public class MTree { 
    class MTreeObject { 
     double[] vector; 
    } 

    class RoutingObject extends MTreeObject { 
     double radius; 
    } 

    class LeafObject extends MTreeObject { 
     int id; 
    } 

    class Node { 
     LinkedList<MTreeObject> list; 
    } 

    class InnerNode extends Node { 
     LinkedList<RoutingObject> list; 
    } 

    class LeafNode extends Node { 
     LinkedList<LeafObject> list; 
    } 

    public static void main(String[] argv) { 
     MTreeObject object = new RoutingObject(); 
     Node node = new InnerNode(); 
     ((InnerNode)node).list.add((RoutingObject)object); 

    } 
} 

的问题是,如果我有,例如:

class Result { 
    Node node; 
} 

然后在主叫

public static void main(String[] argv) { 
    Result result = new Result(); 
    MTreeObject object = new RoutingObject(); 
    result.node = new InnerNode(); 
    result.((InnerNode)node).list.add((RoutingObject)object);  
} 

它不按我想要的方式工作。嗯,我也可以这样做:

newnode = result.node 
((InnerNode)newnode).list.add((RoutingObject)object); 

但后来我不得不太多变数,我更复杂的代码...

+1

这是一个仿制药的工作。 – 2012-04-07 00:26:12

+0

你的课堂设计是纠结的:将这些内部课程移到他们自己的文件 - 使他们成为顶级课程。然后使用泛型。 – Bohemian 2012-04-07 00:38:26

回答

2

问题是你已经宣布所有的类作为内部类MTree的。内部类的实例只能存在于外部类(MTree)的实例中。

试着让你的类(RoutingObject,LeafObject等)独立的类而不是嵌套或 实例化一个内部类,你必须首先实例化外部类。然后,使用以下语法在外部对象内创建内部对象:

MTree mtree = new MTree(); MTree.Node node = mtree.new Node();

参见:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

不太从例如知道你要完成,我的猜测最好的猜测是你应该避免使用嵌套类。希望这可以帮助。

+0

为了在我的更复杂的程序中使用MTree属性更轻松地工作,我在那里有内部类,但是我会尝试您所建议的无论如何谢谢。 – 2012-04-07 00:48:58

+0

我已经解决了它有点不同,无论如何你的答案是有帮助的。 – 2012-04-07 01:28:40