Vererbung - instanceof

086033

Mitglied
Ich habe ein Verleihsystem u.a. mit den Kategorien CD's, DVD's und BlueRay. Folgende Klassen sind enthalten:
- Datenbank
- Medium (Superklasse)
- Digital (Subklasse von Medium)
- Analog (Subklasse von Medium)
- DVD, BlueRay, CD, ... (Subklassen von Digital)
- Buecher (Subklasse von Analog)

Ich konnte soweit die Aufgabenstellung implementieren bis auf einen Punkt:

"Es soll eine Methode
Java:
ausgeben(Medium medium)
implementiert werden, welche alle Datenfelder aller Medien der Kategorie medium ausgibt."

Folgendes habe ich versucht:

Java:
 public void ausgeben(Medium medium)
    // bsp. für CD... 
    {   for(Medium m : medien) {
            if (m instanceof CD) { 
            System.out.println(m);
            }
        }
    }

Das Problem ist nun folgendes:
1. Als Parameter kann ja nur etwas vom Typ Medium eingegeben werden. CD (als Klasse) wird nicht akzeptiert. cD1 (Name einer Instanz der Klasse CD) würde akzeptiert, das bringt mir aber nicht viel.

2. "m" sollte eigentlich durch medium ersetzt werden, nur kann ich die Klasse dann nicht mehr kompilieren.

Ich wäre froh, wenn ihr mir Ansatzpunkte geben könntet, ich glaube nämlich, dass dieser Aufgabenteil überhaupt nicht schwer sein sollte.

Besten Dank!
 

Michael...

Top Contributor
Das Problem ist nun folgendes:
1. Als Parameter kann ja nur etwas vom Typ Medium eingegeben werden. CD (als Klasse) wird nicht akzeptiert. cD1 (Name einer Instanz der Klasse CD) würde akzeptiert, das bringt mir aber nicht viel.
Warum nicht? Wenn CD von Medium erbt, kann überall wo ein Objekt vom Typ Medium erwartet wird jede beliebige Subklasse - auch CD - übergeben werden
Java:
 public void ausgeben(Medium medium)
    // bsp. für CD... 
    {   for(Medium m : medien) {
Das macht keinen Sinn es wird ein einzelnes Objekt vom Typ Medium übergeben, wie soll man da in einer Schleife drüber iterieren?
 

AmunRa

Gesperrter Benutzer
nachdem du ja geprüft hast ob dein Medium eine CD ist kannst du diese Ja in eine CD casten, Ist aber ein nicht ganz schöner Weg,

Der Zweite wäre, du hast in deinem Interface zum Beispiel eine Methode printDetails, und diese Methode überschreibst du jetzt in all deinen Subclassen.

Durch Dynamische Bindung wird nun wenn du m.printDetails() aufrufst im Falle einer CD die Mehtode der CD Klasse aufgerufen und bei einer DVD die der DVD-Klasse

Hoff das hat dir weitergeholfen
 
G

Gastredner

Gast
Oder einfach die toString()-Methode überschreiben und dann einfach die Ausgabe mit [c]System.out.println(medium)[/c] ausführen.
 

086033

Mitglied
Vielen Dank an euch!

Java:
public void ausgeben(Medium medium)
    // bsp. für CD... 
    {   for(Medium m : medien) {
            if (m instanceof CD) { 
            System.out.println(m);
            }
        }
    }

Warum nicht? Wenn CD von Medium erbt, kann überall wo ein Objekt vom Typ Medium erwartet wird jede beliebige Subklasse - auch CD - übergeben werden

Das ist mir eigentlich auch "klar", die Methode ist mir aber vorgegeben mit ausgeben(Medium medium). Diese lässt nur zu, dass ich eine Instanz der Subklassen angeben kann, also eben z.B. cd1, dvd1, ... aber nicht CD als Klasse. Das verunsichert mich.


Das macht keinen Sinn es wird ein einzelnes Objekt vom Typ Medium übergeben, wie soll man da in einer Schleife drüber iterieren?

Macht nun die Schleife an sich keinen Sinn, oder die Parameter? ( also eigentlich das, was ich oben erwähnt habe?)

Zudem macht die Methode so an sich keinen Sinn, weil der Parameter gar nie aufgegriffen wird. Irgendwie stehe ich auf dem Schlauch.

Betreffend toString(), diese Methode habe ich in derselben Klasse bereits mit folgender Methode genutzt (toString wird in den einzelnen Subklassen jeweils überschrieben):

Java:
    /**
     * Gib eine Liste aller aktuell gespeicherten Medien
     * auf der Konsole aus.
     */
    public void ausgeben()
    {
        for(Medium medium : medien)
        {
             System.out.println(medium);
        }
    }

toString möchte ich eigentlich auch wieder bei der "Problem"-Methode nutzen, aber mein Problem ist zurzeit, dass ich nicht begreife, wie ich nur die Daten einer spezifischen Kategorie ausgebe. Es muss mit der Methode
Java:
ausgeben(Medium medium);
umgesetzt werden.
 

kidsos

Aktives Mitglied
Macht nun die Schleife an sich keinen Sinn, oder die Parameter?
Die Schleife macht keinen Sinn. Wo keine Collection ist, kann man auch nicht drüber iterieren. Ideal wäre, wenn du deine Medien in einer Liste (z.B. Arraylist) vorhälst. Dann kannst du problemlos mit der for-Schleife über jeden Eintrag gehen und diesen dann ausgeben. Dazu musst du aber die Methode umbauen, was du nicht darfst. ;)

Mit der Methode "ausgeben(Medium medium)", so wie sie dir vorgegeben ist, übergibst du ja nur ein Objekt. Das kann mit einer for-Schleife nicht funktionieren. Ich würde mir an deiner Stelle die Vorgehensweise von AmunRa näher anschauen. Das könnte klappen.
 

Michael...

Top Contributor
die Methode ist mir aber vorgegeben mit ausgeben(Medium medium). Diese lässt nur zu, dass ich eine Instanz der Subklassen angeben kann, also eben z.B. cd1, dvd1, ... aber nicht CD als Klasse. Das verunsichert mich.
Wieso willst Du die Klasse übergeben? Willst Du sie per Reflection analysieren?
Dann müsste der Methodenrumpf aber eher so aussehen:
Java:
public void ausgeben(Class<? extends Medium) c)
 

086033

Mitglied
Ideal wäre, wenn du deine Medien in einer Liste (z.B. Arraylist) vorhälst. Dann kannst du problemlos mit der for-Schleife über jeden Eintrag gehen und diesen dann ausgeben.

Mit der Methode "ausgeben(Medium medium)", so wie sie dir vorgegeben ist, übergibst du ja nur ein Objekt. Das kann mit einer for-Schleife nicht funktionieren. Ich würde mir an deiner Stelle die Vorgehensweise von AmunRa näher anschauen. Das könnte klappen.

Danke! Nun, die Medien habe ich ja alle in einer ArrayList.

Java:
public class Datenbank
{
    private ArrayList<Medium> medien;

    /**
     * Erzeuge eine leere Datenbank.
     */
    public Datenbank()
    {
        medien = new ArrayList<Medium>();
    }

    /**
     * Erfasse das angegebene Medium in dieser Datenbank.
     * @param medium das erfasst werden soll.
     */
    public void erfasseMedium(Medium medium)
    {
        medien.add(medium);
    }

    /**
     * Gib eine Liste aller aktuell gespeicherten Medien
     * auf der Konsole aus.
     */
    public void ausgeben()
    {
        for(Medium medium : medien)
        {
             System.out.println(medium);
        }
    }

Die letzte Methode funktioniert auch, aber eben nicht die Methode ausgeben(Medium medium) - welche hier jetzt nicht enthalten ist. Wie du gesagt hast, übergebe ich mit der Methode ja nur ein Objekt und demnach keine Kategorie (Klasse).

Ich verstehe die Aufgabenstellung
"Es soll eine Methode
Java:
ausgeben(Medium medium)
implementiert werden, welche alle Datenfelder aller Medien der Kategorie medium ausgibt."

so, dass eben alle Datenfelder der Kategorien "CD, DVD, etc" ausgegeben werden, abhängig vom Parameter den ich übergebe. Aber wie kann ich durch übergabe eines Objekts, die ganzen Datenfelder der Objekte einer spezifischen Kategorie ("Klasse") ausgeben?

oder verstehe ich die Aufgabenstellung falsch? (bzw. versteht ihr das auch so ;))

Sorry, aber alles andere war eigentlich komplizierter (mehr Punkte), aber ich stehe da auf dem Schlauch..
 

086033

Mitglied
Wieso willst Du die Klasse übergeben? Willst Du sie per Reflection analysieren?
Dann müsste der Methodenrumpf aber eher so aussehen:
Java:
public void ausgeben(Class<? extends Medium) c)

Ich glaube, dass ich nicht verstehe, wie ich mit der Übergabe eines Objekts, alle Datenfelder einer Kategorie - ich verstehe das als "alle Datenfelder einer Subklasse, z.B. CD - ausgeben kann.

siehe auch Antwort um 12:35
 

086033

Mitglied
hättest du nicht so viele Beiträge, würde ich nicht nervös werden ;)

es muss etwas mit instanceof zu tun haben.. also
Java:
(medium instanceof CD)

Trotzdem Danke! Hoffentlich kann mir sonst jemand helfen.
 

Schumi

Bekanntes Mitglied
Wenn alle Deine von Medium erbenden Klassen toString implementieren ist es doch gar kein Problem:
Java:
public void ausgeben(Medium medium)
            System.out.println(medium);
    }

Da müsstest Du nicht mal zwischen den einzelnen Klassen unterscheiden, da das ausgeben der jeweiligen Klasse überlassen wird. Sprich, Du brauchst keine instanceof Abfrage. In der toString() Methode der Klasse musst Du dann nur sicher gehen, dass Du auch alle Inhalte dieser Klasse mit ausgibst.
 

Antoras

Top Contributor
Ich fasse die Aufgabe so auf, dass an die Methode ein Medium übergeben wird und dass alle Medien, die den gleichen Typ wie das übergebene Medium haben, ausgegeben werden sollen.

Und die Lösung dafür hast du ja schon beschrieben in Post 5.
 

Schumi

Bekanntes Mitglied
Wenn es wirklich das ist, dann steht die Lösung ja sogar schon in Post 1:



Folgendes habe ich versucht:

Java:
 public void ausgeben(Medium medium)
    // bsp. für CD... 
    {   for(Medium m : medien) {
            if (m instanceof CD) { 
            System.out.println(m);
            }
        }
    }
Das Problem ist nun folgendes:
1. Als Parameter kann ja nur etwas vom Typ Medium eingegeben werden. CD (als Klasse) wird nicht akzeptiert. cD1 (Name einer Instanz der Klasse CD) würde akzeptiert, das bringt mir aber nicht viel.

Fragt sich nur, warum das nicht viel bringt?

Ah ne, man muss natürlich vorher noch die medien-Klasse prüfen. Oder eben bei jedem m schauen, ob die Klasse gleich der des übergebenen Mediums ist.
 

Suinos

Bekanntes Mitglied
Möglichkeit 1:
Du sollst nur die gemeinsamen Werte eines Mediums ausgeben.
Dann muss
Code:
Medium
aber getter-Methoden vorgeben, welche du aufrufen kannst:
Java:
System.out.println("Autor: " + medium.getAuthor());
System.out.println("Länge: " + medium.getLength());

Möglichkeit 2:
Du sollst herausfinden, welches Objekt sich hinter der Referenz befindet, auf eine neue Referenz casten und dann darauf spezielle Methoden aufrufen:
Java:
if (medium instanceof CD)
{
	CD cd = (CD) medium;
	
	System.out.println("Anzahl an Songs: " + cd.getSongsCount());
}

---

Das mit der
Code:
toString
Methode kann doch nicht sein, da man dann einfach diese Zeile Code:
Java:
System.out.println(medium);
, mit dieser hier ausgetauscht hat:
Java:
ausgeben(medium);

Das würde sich kaum lohnen.
 

Schumi

Bekanntes Mitglied
Um noch einmal Antoras Verständnis der Aufgabe aufzugreifen:
Java:
 public void ausgeben(Medium medium)
    {   for(Medium m : medien) {
            if (m.getClass() == medium.getClass()) { 
            System.out.println(m);
            }
        }
    }

würde es bei implementierten toString tun.
 

086033

Mitglied
edit: das ist dasselbe Ergebnis wie das von Schumi, oder? (mit der Ausnahme, dass seines viel eleganter ist ;))

Hab mal folgendes versucht und es funktioniert anscheinend. Aber... wieso sollte ich ein Objekt angeben müssen um alle Datenfelder der Kategorie (Klasse) auszugeben? Ist es richtig, dass es mit der Methode ausgeben(Medium medium) keine Möglichkeit gibt, die Klasse anzugeben?

Java:
public void ausgeben(Medium medium)
    {
        if (medium instanceof CD) {
            for(Medium m : medien) {
                if (m instanceof CD) {
                    System.out.println(m);
                }
            }
        }
        
        else if (medium instanceof DVD) {
            for(Medium m : medien) {
                if (m instanceof DVD) {
                    System.out.println(m);
                }
            }
        } 
       
        else if (medium instanceof BlueRay) {
            for(Medium m : medien) {
                if (m instanceof BlueRay) {
                    System.out.println(m);
                }
            }
        }
        
        else if (medium instanceof Videospiele) {
            for(Medium m : medien) {
                if (m instanceof Videospiele) {
                    System.out.println(m);
                }
            }
        }
        
    }
 

086033

Mitglied
"Es soll eine Methode ausgeben(Medium medium) implementiert werden, welche alle Datenfelder aller Medien der Kategorie medium ausgibt."

"Kategorie medium" das kann doch nicht sein... unsere Lösung ist nun:

"Es soll eine Methode ausgeben(Medium medium) implementiert werden, welche alle Datenfelder aller Medien mit derselben Kategorie wie der von medium ausgibt."

oder? sorry, tut mir leid!

noch ein Nachtrag:

Im Buch "java lernen mit BlueJ" steht:

9.10 Der Operator instanceof

"... Doch was wäre, wenn wir nur die CDs oder DVDs aus der Liste herausziehen möchten? ... Nach dem Einsatz von instanceof-Operators folgt oft direkt eine Typumwandlung der Objektreferenz in den identifizierten Typ - wie in dem folgenden Code, der alle CDs aus einer Medienliste herausfiltert und iner eigenen Liste speichert:"

Java:
ArrayList<CD> cds = new ArrayList<CD>();
for(Medium medium : medien) {
if(medium instanceof CD) {
cds.add((CD) medium);
}}

Kann es mit diesem Code etwas zu tun haben? Muss nicht, oder? Da die ArrayList ja schon besteht, allerdings mit allen Medien.
 
Zuletzt bearbeitet:
G

Gastredner

Gast
Java:
ArrayList<CD> cds = new ArrayList<CD>();
for(Medium medium : medien) {
if(medium instanceof CD) {
cds.add((CD) medium);
}}
Das ist genau das, was du benötigst. Du ermittelst die Klasse des übergebenen Mediums, suchst dir alle Medien vom gleichen Typ zusammen und gibst diese dann aus. Ersteres kannst du so wie in dem obrigen Code machen (ich würde es aber anders machen, folgt gleich), Letzteres damit, dass du in allen von Medium erbenden Klassen die Methode toString() überschreibst.

Das Herausfiltern würde ich statt mit instanceof eher mit einem Vergleich der Klassen erledigen, dies ist flexibler. Außerdem kann man sich das Speichern in einer separaten Liste sparen, wenn man die Ausgabe direkt erledigt. Konkret hieße das also:
Java:
public void ausgeben(Medium medium) {
	Class<? extends Medium> clazz = medium.getClass();
	for (Medium m: medien) {
		if (m.getClass().equals(clazz)) {
			System.out.println(m);	// Hier wird von println() auf m die Methode toString() aufgerufen - die du zuvor überschrieben haben musst.
		}
	}
}
Du musst dann halt nur noch die toString()-Methode in allen Unterklassen von Medium überschreiben. Durch den Abgleich der Klassen musst du außerdem keine neuen instaceof-Abfragen einbauen, wenn du eine weitere Klasse von Medium erben lässt und diese in das Programm integrieren willst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
M Vererbung - Polymorphie Java Basics - Anfänger-Themen 37
L Java- Vererbung Java Basics - Anfänger-Themen 4
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 12
ineedhelpinjava Vererbung Java Basics - Anfänger-Themen 1
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
M Vererbung Java Basics - Anfänger-Themen 6
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Java Basics - Anfänger-Themen 7
D Vererbung Java Basics - Anfänger-Themen 3
K Schleife berechnet kein Ergebnis (Vererbung) Java Basics - Anfänger-Themen 6
00111010101 Objektorientiertes Programmieren mit Vererbung (Zahlen in Array verschwinden) Java Basics - Anfänger-Themen 3
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
H Datenkapselung, Vererbung und UML Java Basics - Anfänger-Themen 16
districon Super-Stichwort/ Vererbung Java Basics - Anfänger-Themen 3
YaU Vererbung erstellt NullPointerException? Java Basics - Anfänger-Themen 4
1 Vererbung Klassenattribute Java Basics - Anfänger-Themen 9
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
N Thema Vererbung Java Basics - Anfänger-Themen 31
A Vererbung Vererbung Übung Java Basics - Anfänger-Themen 5
B Vererbung - Sichtbarkeitsmodifikation - protected Java Basics - Anfänger-Themen 10
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
G Java Vererbung Java Basics - Anfänger-Themen 8
Y Vererbung Konto - Anfangsprobleme Java Basics - Anfänger-Themen 7
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
M Vererbung mit Enums Java Basics - Anfänger-Themen 8
Kirby.exe Vererbung im Detail erklärt? Java Basics - Anfänger-Themen 9
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung im Computerspiel Java Basics - Anfänger-Themen 7
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
I Vererbung Java Basics - Anfänger-Themen 13
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
V Vererbung Java Basics - Anfänger-Themen 2
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
J Vererbung Java Basics - Anfänger-Themen 3
U Was löst meine NullPointerException aus? (Vererbung) Java Basics - Anfänger-Themen 12
O Vererbung Ueben mit kleiner Datenstruktur von Räumen Java Basics - Anfänger-Themen 10
O Umgang mit Vererbung verstehen Java Basics - Anfänger-Themen 4
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
O Vererbung änderung des Konstruktors Java Basics - Anfänger-Themen 8
L Vererbung Java Basics - Anfänger-Themen 5
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
E Vererbung super-Methoden Aufruf Java Basics - Anfänger-Themen 3
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
A Objekterstellung bei der Vererbung Java Basics - Anfänger-Themen 7
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
S Vererbung Java mehrfach Java Basics - Anfänger-Themen 10
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
A Klassen Vererbung privater Methoden und Member Java Basics - Anfänger-Themen 12
A Konstruktoren Vererbung Java Basics - Anfänger-Themen 3
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
W Vererbung, abstract und Konstruktoren Java Basics - Anfänger-Themen 30
J Vererbung und Methodenaufruf Java Basics - Anfänger-Themen 11
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
H Vererbung mit private instanzvariablen Java Basics - Anfänger-Themen 9
S Vererbung Funktionsweise Code zur Vererbung Java Basics - Anfänger-Themen 1
C Methoden Vererbung private Attribute/public Methoden Java Basics - Anfänger-Themen 4
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
U Vererbung Generizität und Vererbung Java Basics - Anfänger-Themen 4
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
K Vererbung Octagon von Circle Java Basics - Anfänger-Themen 0
B Hilfe bei Vererbung Java Basics - Anfänger-Themen 2
D Vererbung Frage zum Klassenaufbau mit Vererbung Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 1
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
D Vererbung / Polymorphie Java Basics - Anfänger-Themen 5
O Vererbung Java Basics - Anfänger-Themen 5
MiMa Vererbung Theorie OK, Praxis ?? Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
C Vererbung - Ausgaben bestimmen Java Basics - Anfänger-Themen 6
S Vererbung Java Basics - Anfänger-Themen 10
L Setter und Getter/Vererbung Java Basics - Anfänger-Themen 6
C Konstruktoren und Vererbung Java Basics - Anfänger-Themen 2
J Kleinere Frage zur Vererbung/Objekterzeugung Java Basics - Anfänger-Themen 2
G Vererbung Java Basics - Anfänger-Themen 12
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
J Vererbung Vererbung von Methoden Java Basics - Anfänger-Themen 6
B Vererbung Java Basics - Anfänger-Themen 12
K Vererbung (super) Java Basics - Anfänger-Themen 2
A ArrayQueue mit Exceptions und Vererbung Java Basics - Anfänger-Themen 3
J Java: static bei Vererbung Java Basics - Anfänger-Themen 5
C Vererbung Java Basics - Anfänger-Themen 4
L Vererbung Java Basics - Anfänger-Themen 3
J Klassenorganisation | Vererbung Java Basics - Anfänger-Themen 1
B Vererbung Vererbung Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
A Benötige Hilfe bei Vererbung Java Basics - Anfänger-Themen 1
M Anfängerprobleme mit Vererbung Java Basics - Anfänger-Themen 27
J Vererbung Java Basics - Anfänger-Themen 9
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben