2012-04-07 15 views
0

Ich würde fragen, ob es eine elegantere Weg ist, den folgenden Code zu schreiben:Java - Polymorphismus mit Sammlung Attribute

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); 

    } 
} 

das Problem ist, dass, wenn ich zum Beispiel:

class Result { 
    Node node; 
} 

und rufen dann in Haupt

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);  
} 

es nicht die Art und Weise funktioniert ich will. Nun, ich könnte auch tun:

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

aber dann hätte ich zu viel Variablen in meinem komplexeren Code ...

+1

Dies ist ein Job für Generika. –

+0

Ihr Klassendesign ist verworren: Verschieben Sie diese inneren Klassen in ihre eigene Datei und machen Sie sie zu Top-Level-Klassen. Dann verwende Generika. – Bohemian

Antwort

2

Das Problem ist, Sie haben erklärt, alle Klassen als innere Klassen von mtree. Eine Instanz Ihrer inneren Klassen kann nur innerhalb einer Instanz der äußeren Klasse (MTree) existieren.

Versuchen Sie, Ihre Klassen (RoutingObject, LeafObject usw.) eigenständige Klassen statt verschachtelt oder zu bilden, um eine innere Klasse zu instanziieren, müssen Sie zuerst die äußere Klasse instanziieren. Dann erstellen Sie das innere Objekt innerhalb des äußeren Objekts mit folgender Syntax:

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

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

Nicht ganz sicher aus Ihrem Beispiel, was Sie versuchen meine Vermutung beste Vermutung zu erreichen, ist, dass Sie sollten nur nicht verschachtelte Klassen verwenden. Hoffe das hilft.

+0

Ich habe dort die inneren Klassen, um mit MTree Attributen in meinem komplexeren Programm einfacher zu arbeiten, aber ich werde versuchen, was Sie vorschlagen, trotzdem danke. –

+0

Ich habe es ein bisschen anders gelöst, trotzdem war deine Antwort hilfreich. –