Vererbung Best Practice: Verfeinerte Klassenvariablen in Unterklasse

Naryxus

Aktives Mitglied
Hallo,

ich muss mich momentan mit Graphenalgorithmen beschäftigen. Eine Aufgabe ist unter anderem das Zeichnen von planaren Graphen.
Zur grundlegenden Modellierung eines Graphen benutze ich
Java:
public class Node {

   private String label;
}

und
Java:
public class Edge {

   private Node node0;
   private Node node1;
}

Für einen normalen Graphen reicht dies erst einmal aus.
Meine Modellierung für einen zeichenbaren Graphen erweitert die Knoten um Bildschirmpositionen, damit ich nicht noch großartig mit Maps auf Canvas-Objekte arbeiten muss:
Java:
public class GraphicalNode extends Node {

   private int x;
   private int y;
}

Auch dies funktioniert nach meinem Verständnis ganz gut.
Designprobleme bekomme ich bei der Modellierung der zeichenbaren Kanten.
Prinzipiell würde ich ganz gerne folgendes machen:
Java:
public class GraphicalEdge extends Edge {

   GraphicalNode node0;
   GraphicalNode node1;
}

So würde ich am wenigsten redundante Informationen speichern. Allerdings habe ich solch ein Design bis jetzt noch in keinem Projekt gesehen. Und zudem schmeißt mir der Compiler auch einen Fehler um die Ohren, dass ich (natürlich) für den Konstruktor der Oberklasse auch in dieser Klasse einen mit der Signatur
Java:
public GraphicalNode(Node node0, Node node1)
benötige.
Eine andere Möglichkeit wäre, der Klasse GraphicalNode statt den GraphicalNodes lediglich normale Nodes zu übergeben und dazu dann noch die Positionen der Nodes zusätzlich zu speichern.
Das wäre aber meiner Meinung nach alles andere als schön und überaus redundant.

Kann mir jemand helfen?

Grüße, Naryxus
 

Joose

Top Contributor
Nein in der Klasse GraphicalNode brauchst du keinen Konstruktor, welcher 2 Node Objekte entgegen nimmt.
Du musst nur dafür sorgen das der Konstruktor der Oberklasse aufgerufen wird (mit mehr oder weniger passenden Parametern).

Java:
public class GraphicalEdge extends Edge {
   public GraphicalEdge(GraphicalNode node1, GrahpicalNode node2) {
     super(node1, node2);
   }
}

Wie schaut der Konstruktor für die Klasse GraphicalNode denn aus?
 

Naryxus

Aktives Mitglied
Schneide ich dann nicht die Positionsinformationen von den Nodes ab mit der Lösung?

Der Konstruktor für GraphicalNode ist momentan eigentlich recht schlicht:
Java:
public GraphicalNode(String label, int x, int y) {
   this.label = label;
   this.x = x;
   this.y = y;
}

Grüße
 

Jardcore

Top Contributor
Nein tust du nicht, da du speziell die GraphicalNode's übergibst.

Vielleicht wäre es aber auch sinnvoll deine Daten von deiner grafischen Repräsentation zu trennen.
So das du dir einen Renderer schreiben könntest, dieser würde normale Node und Edge Objekte übergeben bekommen und diese entsprechend zeichnen.
 

Joose

Top Contributor
Jetzt komm ich erst drauf .... der Compiler meint du brauchst einen Konstruktor in der Klasse GraphicalNode welcher 2 Node Objekte als Parameter entgegen nimmt.
Die Klasse GraphicalNode leitet ja von Node ab, daher wäre es interessant wie der Konstruktor von Node ausschaut (alle, falls mehrere vorhanden) und dann bitte auch noch die genaue Fehlermeldung.

Anhand deines bisherigen Code kommt die Fehlermeldung sehr komisch rüber.

Hier mal meine Variante (sehr simple gemacht ohne viele getter und setter damit es ned zu viel wird)
Java:
public class Node {
   private String label;
  
   public Node(String label) {
     this.label = label;
   }
}

public class GraphicalNode extends Node {
   private int x;
   private int y;

   public GraphicalNode(String label, int x, int y) {
     super(label);
     this.x = x;  
     this.y = y;
   }
}

public class Edge {
   private Node node0;
   private Node node1;
  
   public Edge(Node node0, Node node1) {
     this.node0 = node0;
     this.node1 = node1;
   }
  
   public Node getNode0() {
     return node0;
   }
}

public class GraphicalEdge extends Edge {
   public GraphicalEdge(GraphicalNode node1, GrahpicalNode node2) {
     super(node1, node2);
   }
  
   public GraphicalNode getNode0(){
     return (GraphicalNode)super.getNode0();
   }
}
 

Naryxus

Aktives Mitglied
Eine ähnliche Antwort habe ich gerade auch auf stackoverflow bekommen. Dass ich da nicht vorher draufgekommen bin. :rolleyes: Obwohl das im ersten Semester des Studiums drankam.
Ich danke dir vielmals! Ich werde das gleich mal ausprobieren

Grüße
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben