FB18 - Das Forum für Informatik

fb18.de / Bachelorstudieng / PM Praktische Informatik

SE2 Blatt 03 Frage

SE2 Blatt 03 Frage 2009-05-02 14:57
Anonymer User
Hallo liebe Kommilitoten. Ich habe da ein kleines Problem - weiss nur nicht ob es an der Syntax oder am Verständnis liegt.

Ich bin beim dritten Blatt Aufgabe 3.3 . Hier soll man ja in 3.3.1 die "spezifischen Informationen" von CD oder DVD in die TextArea einfügen. Jetzt ist es kein Problem das mit den Methoden bzw Operationen zu tun, die im Interface Medium definiert sind. Ich denke aber, dass man auch die nicht im Interface vorhandenen Methoden (wie z.B. gibInterpret() ) einbinden soll. Natürlich meldet mir der Compiler, dass die Methode gibInterpret nicht in Medium definiert ist. Deswegen habe ich versucht nochmal eine Typzusicherung in _ausgewaehlteMedienTextArea.append() reinzukriegen (davor steht natürlich schon eine), unten könnt ihr sehen wie ich das versucht habe. Wie erwartet funktioniert das so nicht.

Ich denke es ist gegen den Sinn der Aufgabe die fehlenden Methoden im Interface einzufügen, ich soll ja durch Typzusicherung von einem allgemeineren Typ einen spezielleren ansprechen. Oder verstehe ich das jetzt falsch?

Hier ein Beispielcode (nur mit CD)


        for (Medium medium : selektierteMedien)         {             // Die folgende Zeile zeigt beispielhaft, wie man Text in die             // TextArea einfügt.             // _ausgewaehlteMedienTextArea.append("Einzufügender Text);             if(medium instanceof CD)             {              medium = (CD)medium;              _ausgewaehlteMedienTextArea.append(medium.gibMedienBezeichnung()+ "\r\n"  + medium.gibTitel() + "\r\n" + medium.gibKommentar() + medium instanceof CD ? (CD)medium.gibInterpret(): "");             }                     }

RE: SE2 Blatt 03 Frage 2009-05-02 15:09
Muelli
woran merkst du, dass es nicht funktioniert? (Fehlermeldung oder so…)

Den letzten Cast solltest du dir sparen koennen, nicht zuletzt, weil er auch noch falsch ist.

Wenn das Medium Interface die Methoden gibMedienBezeichnung, gibTitel und gibKommentar vorschreibt (wieso eigtl. "gib" statt "get"?) und "CD" sowohl das Interface als auch die Methode gibInterpret implementiert, sollte das ungefaehr so funktionieren…

RE: SE2 Blatt 03 Frage 2009-05-02 15:17
Fred
for (Medium medium : selektierteMedien)

medium = (CD)medium;
Das kann so nicht funktionieren. Was genau passiert hier?

Die Variable medium ist vom statischen Typ Medium, weil wir das in Zeile 1 so deklariert haben. An dieser Tatsache kannst Du nichts mehr verändern. Eine einmal deklarierte Variable hat IMMER denselben statischen Typ. Ansonsten wäre die Bezeichnung statisch auch leicht sinnlos.

Der Ausdruck "(CD) medium" ist ein Ausdruck, der eine Referenz zurückliefert mit dem statischen Typ CD. So weit so gut. Leider weist Du diesen Ausdruck aber wieder der ursprünglichen Variable medium zu. Der Compiler erlaubt das, weil jede CD auch ein Medium ist, aber dass es sinnlos ist, kann er nicht wissen.

Was Du eigentlich möchtest, ist eine neue Variable vom statischen Typ CD zu deklarieren:
CD cd = (CD) medium; Nun kannst Du über die Variable cd auf alle Eigenschaften der CD zugreifen.

Dein zweiter "medium instanceof CD"-Test wird übrigens immer true zurückliefern, da wir ja nur in diesen Codeabschnitt reingehen, falls ebendiese Bedingung true ist.

Außerdem gibt es noch ein Problem in dem Ausdruck "(CD)medium.gibInterpret()", und zwar geht es um Operatorpräzedenzen. Für den Java Compiler sieht es so aus, als würdest Du gibInterpret auf medium aufrufen, und dann das Ergebnis dieses Operationsaufrufs (wahrscheinlich ein String?) auf CD casten wollen. Der Operator "." bindet halt stärker als der Operator "(type)", weil das wohl in den meisten Fällen sinnvoll ist.

RE: SE2 Blatt 03 Frage 2009-05-02 15:21
Anonymer User
Stimmt, cast war falsch geschrieben. Ohne zweite Abfrage und nur einem cast funktioniert es jetzt, ganz ohne Cast geht es aber nicht. Dann sagt es mir gibInterpret is undefiened for the Type Medium. Vermutet habe ich auch, dass das nach der ersten Typzusicherung in diesem Block funktinieren sollte, tut es aber nicht. o_O. Immernoch ein Fehler oder muss ich die speziellen Methoden immer einzeln casten?

RE: SE2 Blatt 03 Frage 2009-05-02 15:22
Fred
Was Du eigentlich möchtest, ist eine neue Variable vom statischen Typ CD zu deklarieren:
CD cd = (CD) medium; Nun kannst Du über die Variable cd auf alle Eigenschaften der CD zugreifen.

RE: SE2 Blatt 03 Frage 2009-05-02 15:23
Anonymer User
@Fred
Ahhhh! Ein Licht geht auf, danke für die Variableninfo!

Dein zweiter "medium instanceof CD"-Test wird übrigens immer true zurückliefern, da wir ja nur in diesen Codeabschnitt reingehen, falls ebendiese Bedingung true ist.

Das war mir klar, es war auch irgendwie so ein Akt der Verzweiflung. Hab mir gedacht vllcht will der Compiler das sinnloserweise einfach so.

Jetzt ist mir alles klar. Besten Dank ihr zwei.

RE: SE2 Blatt 03 Frage 2009-05-02 15:29
Fred
@Fred
Ahhhh! Ein Licht geht auf, danke für die Variableninfo!
Gern geschehen. Ist ja dasselbe Prinzip wie beim Redefinieren von equals:
class Person { ... public boolean equals(Object o) { // o ist vom statischen Typ Object     ...     if (o instanceof Person) // Typtest     {         Person p = (Person) o; // Typzusicherung         ...     } } }