Vererbung Queue bestehend aus Superclass- und Subclass-Objekten

Nick9051

Mitglied
Hi,

ich baue eine polymorphe Queue aus Objekten einer Superclass und einer Subclass.

Mein Problem:
Die Subclass-Elemente haben einen extra-Wert.
Die Elemente sollen weiter in der Queue nach vorne rücken desto höher dieser Wert ist.
Beispiel:
A ist ein Objekt der Superclass.
B ist ein Objekt der Subclass mit dem Wert 1.
C ist ein Objekt der Subclass mit dem Wert 2.
Eingefügt wird in der Reihenfolge (A -> B -> C)
Nach dem Einreihen aller Objekte soll die Reihenfolge folgende sein: C, B, A. Wobei C das vorderste Element ist.

Meine Fragen:
Wie überprüfe ich, ob ein Element meiner Queue ein Element der Subclass ist? (Mit instanceof ?)
Wie bekomme ich den Wert des Objektes, um ihn mit meinem neuen Wert zu vergleichen?

Danke schonmal für eure Hilfe. Ich verzweifle leicht.
Code kann ich beifügen wenn gewünscht, ist aber mMn relativ unübersichtlich.

VG
 

fhoffmann

Top Contributor
Möglicherweise hast du deine Superclass und Subclass falsch geplant.
Kann nicht die Superclass das Element kennen (zumindestens als get-Methode), das dann immer auf einem niedrigen Wert (beispielsweise 0) steht.

Das Benutzen von instance of ist zwar möglich, aber oft ein Zeichen von einem Designfehler.
 

Nick9051

Mitglied
Im Anhang hier ein UML-Diagramm vom Problem.
Das stammt aus einer Aufgabe aus der Uni.
Ich hatte angenommen, dass zusätzliche Methoden oder Variablen nicht erlaubt sind, weswegen ich keine weiteren getter und setter eingebaut habe.
 

Anhänge

  • preorder.pdf
    57,5 KB · Aufrufe: 0

fhoffmann

Top Contributor
Das konnt ich ja nicht ahnen: Wenn das Beispiel von der Uni stammt, musst du natürlich mit instanceof arbeiten.
Es bleibt aber richtig, dass du außer bei solchen Übungen, das instanceof als "Geschmäckle" betrachten solltest.
 

Nick9051

Mitglied
Hast du denn ne Idee wie ich die Variable aus der Subklasse bekomme nachdem ich die Abfrage gemacht habe ob es ein Objekt der Subklasse ist?
 

Nick9051

Mitglied
Ich denke im Endeffekt liegt mein Problem beim Polymorphismus / bei den Generics.
Kannst du / könnt ihr mir sagen woran das liegt und wie ich die Queue generic halten kann, sodass man sowohl Node und BribeNode als "next" nutzen kann? Sonst funktioniert die ganze Queue so ja nicht, oder?


[CODE lang="java" title="Node.java"]
public class Node <T>{
public T value;
public Node <T> next;
public Node <T> previous;
}
[/CODE]

[CODE lang="java" title="BribeNode.Java"]
public class BribeNode<T> extends Node<T> implements Bribable {
protected long bribery;
@Override
public long getBribery() {
// TODO Auto-generated method stub
return this.bribery;
}
}
[/CODE]

[CODE lang="java" title="PreorderQueue.java" highlight="39-69"]
public class PreorderQueue<T> {
public Node<T> first;

public PreorderQueue(){
}


public Boolean isEmpty() {
if (this.first != null) {
return false;
}
else return true;
}


public void preorder(T value) {
if (value != null) {
if (this.first == null) {
this.first = new Node<T>();
this.first.value = value;
}
else {
Node<T> temp = new Node<>();
temp = this.first;
while (temp.next != null) {
temp = temp.next;
}
temp.next = new Node<>();
temp.next.value = value;
}


}
}



public void preorderWithBribery(T value, long bribery) {
if (bribery <= 0) {
throw new IllegalArgumentException("Der Wert ist zu klein");
}
System.out.println("Test auf Bribery");

Node<T> temp = new Node<>();
BribeNode<T> bribe = new BribeNode<>();
bribe.value = value;
bribe.bribery = bribery;

if (value != null) {
if (this.first == null) {
this.first = bribe;
}
else if (this.first instanceof BribeNode) {
System.out.println("first ist bribery");


}


}
else if(!(this.first instanceof BribeNode)){
System.out.println("first ist kein bribery");
temp = this.first;
this.first = bribe;
this.first.next = temp;
}

}

public T processPreorder() {
Node<T> temp = this.first;
if (this.first == null) {
throw new NullPointerException("Die Schlange ist leer");
}
if (this.first.next == null) {
this.first = null;

}
else if (this.first.next != null) {
this.first = this.first.next;
}
return temp.value;
}

public T getFirstPreorder() {
if (this.first == null) {
throw new NullPointerException("Die Schlange ist leer");
}
else {
return this.first.value;
}
}


}[/CODE]
 

mihe7

Top Contributor
Ich denke im Endeffekt liegt mein Problem beim Polymorphismus
Das erste, was Du verstehen musst, ist dass eine Referenzvariable (Variable komplexen Typs) nicht das Objekt speichert sondern nur die Referenz darauf. Insofern gibt z. B. Deine Zeile 23 in Verbindung mit 24 überhaupt keinen Sinn: Du erzeugt ein neues Node-Objekt, speicherst dessen Referenz in temp ab und überschreibst temp im nächsten Schritt mit this.first. In Zeilen 28 und 29 verhält es sich anders: dort wird in Zeile 29 auf value des zuvor erzeugten Nodes zugegriffen.

Das zweite ist, dass der im Quelltext deklarierte Typ einer Referenzvariablen dem Compiler sagt, wie er die Objekte betrachten soll, wenn die Variable verwendet wird. Zuweisen kannst Du Objekt des deklarierten oder eines davon (direkt oder indirekt) abgleiteten Typs.

Dein first ist vom Typ Node<T>, daher kannst Du normalerweise auch nur auf die Methoden und Variablen zugreifen, die von Node<T> (oder eines Supertyps) deklariert wurden.

Das ist nicht anders wie hier:
Java:
String text = "ABC";
Object value = text; // Zuweisung ist ok, das String von Object abgeleitet ist

System.out.println(text.length()); // OK, da text vom Typ String ist und String die Methode length() definiert
System.out.println(value.length()); // Nicht OK, da value vom Typ Object ist und Object die Methode length() nicht kennt.

Was Du tun kannst, ist dem Compiler zu sagen, dass er value so behandeln soll, als wäre die Variable vom Typ String. Das erledigt man mit einem Cast:
Java:
String valueAsString = (String) value;
System.out.println(valueAsString.length()); 
// oder ohne zusätzliche Variable:
System.out.println( ((String) value).length() ); // die zusätzlichen Klammern sind notwendig, da der Punkt-Operator Vorrang vor dem Cast hat

Auf Dein Problem umgemünzt, z. B.
Java:
if (first instanceof BribeNode) {
    BribeNode<T> bribeFirst = (BribeNode<T>) first;
    // ...
}

Nebenbei: Du hast das UML nicht richtig umgesetzt: die Instanzvariablen sind dort private.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
B Zahlenfolge von Queue in Stack Java Basics - Anfänger-Themen 29
J Java Queue mit default Werten erstellen Java Basics - Anfänger-Themen 4
P Priority Queue Performance Java Basics - Anfänger-Themen 3
Chabub Hilfe bei Stacks und Queue Java Basics - Anfänger-Themen 2
G Stack und Queue Arbeitsblatt Java Basics - Anfänger-Themen 3
F Queue zyklisch Java Basics - Anfänger-Themen 8
D Queue vs. Stack Java Basics - Anfänger-Themen 6
L Queue mithilfe von 2 Stacks erstellen Java Basics - Anfänger-Themen 1
B Automatisierung von Jobs / @EJB Scheduler / Verhinderung, dass Queue überläuft Java Basics - Anfänger-Themen 2
A Priority Queue / Comparator Java Basics - Anfänger-Themen 6
J Queue Warteschlange Java Basics - Anfänger-Themen 3
J Liste,Queue,Stack sortieren Java Basics - Anfänger-Themen 2
Y Unendlicher Ringbuffer (Queue) Java Basics - Anfänger-Themen 49
C Stack und Queue in Aktion (Bitte Hilfe für die Klausur) Java Basics - Anfänger-Themen 7
E Stack vs Queue - Gemeinsamkeiten / Unterschiede Java Basics - Anfänger-Themen 7
H Collections StackOverflowError in einer Queue Java Basics - Anfänger-Themen 3
R Klassen Die lineare Datenstruktur Queue Java Basics - Anfänger-Themen 3
JokerBlacky Klassen Klasse Queue Klasse mit Attributen anhängen und auslesen können Java Basics - Anfänger-Themen 4
K Queue enq Fehler Java Basics - Anfänger-Themen 2
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
A Queue (Array) leeren Java Basics - Anfänger-Themen 1
F HTTP Get Queue Java Basics - Anfänger-Themen 7
J Queue zyklisch auslesen Java Basics - Anfänger-Themen 4
B Generische Queue programmieren Java Basics - Anfänger-Themen 5
T Priority-Queue Java Basics - Anfänger-Themen 9
S Integer/Value-Paar in Prio-Queue ohne Comparator Java Basics - Anfänger-Themen 5
P Array queue problem Java Basics - Anfänger-Themen 1
L Queue programmieren via BlueJ Java Basics - Anfänger-Themen 5
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
I Erste Schritte Queue Java Basics - Anfänger-Themen 14
G Queue auf einer Seite löschen, andre Seite schreiben Java Basics - Anfänger-Themen 3
G Queue mit int oder float Java Basics - Anfänger-Themen 3
Q queue.remove Element trotzdem noch vorhanden. Java Basics - Anfänger-Themen 10
P Priority Queue Java Basics - Anfänger-Themen 6
M Compiler-Fehler Queue als ArrayList mit Exceptions Java Basics - Anfänger-Themen 3
S Fehler beim Auslösen des ActionListeners in Verbindung mit einer Queue Java Basics - Anfänger-Themen 5
B Queue mit Daten aus einem Stack füllen Java Basics - Anfänger-Themen 21
P Collections Queue mittels ArrayList Java Basics - Anfänger-Themen 2
T Collections Queue<? extends Number> add() offer() Java Basics - Anfänger-Themen 13
S Queue als doppelt verkettete Liste Java Basics - Anfänger-Themen 2
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
B Queue problem! Java Basics - Anfänger-Themen 2
R Queue abhören und Message in Browser ausgeben Java Basics - Anfänger-Themen 3
T Erstellung von Queue mit verkketten listen Java Basics - Anfänger-Themen 3
kulturfenster Stack / Queue Implementationen Java Basics - Anfänger-Themen 11
K Priority Queue - wo ist denn jetzt der Vorteil? Java Basics - Anfänger-Themen 7
W Iterator in Queue Java Basics - Anfänger-Themen 5
Q An erste Stelle in eine Queue eintragen Java Basics - Anfänger-Themen 4
H Stack und Queue Java Basics - Anfänger-Themen 6
M Threadsichere Queue in Java 1.5? Java Basics - Anfänger-Themen 2
G Int-Queue in String-Queue umwandeln Java Basics - Anfänger-Themen 5
A Queue erweitern Java Basics - Anfänger-Themen 13
P Queue, Stacks, Listen Java Basics - Anfänger-Themen 7
S Queue als Array implementiert get()? Java Basics - Anfänger-Themen 4
S Queue als verkettete Liste Java Basics - Anfänger-Themen 9
S Queue Java Basics - Anfänger-Themen 30
K Prüfen, ob Queue leer ist Java Basics - Anfänger-Themen 5
E String bestehend aus Ziffern in Zahl verwandeln Java Basics - Anfänger-Themen 3
S ArrayList bestehend aus ArrayList? Java Basics - Anfänger-Themen 10
T Drucken von Listen bestehend aus Grafik und Text (unter swing) Java Basics - Anfänger-Themen 7
N Vererbung Verschiedene Subclasses nach cast zur Superclass unterscheiden Java Basics - Anfänger-Themen 9
M Datentypen function(Vector<SuperClass>), Vector<Subclass> Java Basics - Anfänger-Themen 6
C Superclass und Subclass Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben