Hallo Leute ich habe ein Programm, das mehrere Klassen hat
Dabei gibt es die allgeine abstrakte Klasse Medien von dieser erben(mit Unterklassen) :
-1) Audio
-> Kassette
-> CD
-2) Video
-> DVD
-> Blueray
Die Klasse DVD hat außerdem ein Interface IOffer welches diverse Methoden wie sonderangebot() hat.
Nun erstelle ich in einer neuen Klasse mehrer Medien. Daruter sind sowohl DVD als auch Kassetten, Bluerays oder CDs. Das alles in einer Liste. Nun möchte ich gucken, ob ein Objekt aus dieser Liste die Methode sonderangebot() beinhaltet. Da ja nur DVDs diese Methode haben.
Wenn ich allerdings medium.xxx (medium ist das Objekt, welches betrachtet werden soll) auswähle kommen nur die Methoden aus der Klasse Medium und nicht die Methode sonderangebot oder andere wieso das ?
Um auf die Methoden der konkreten Klassen zugreifen zu können, musst du dein Objekt auf diese "casten".
Auf der Abstraktionsebene, bei der du Medien verwendest, solltest du das auch nur auf der Ebene betrachten.
Du kannst natürlich mit instance of prüfen, ob das Objekt auch das und das Interface implementiert, aber imho ist das ein anzeichen dafür, dass hier eine Klasse macht, wofür sie nicht genügend Kompetenzen hat.
Habe auch überlegt über getclass().getMethod() die Methode zu suchen aber es muss ja irgendwie einen einfacheren Weg geben. Ich melde mich dann heute Abend nochmal mit neuen Erkentnissen
Wenn du Medium einMedium = new Dvd() machst. Dann siehst du nur die Methoden von Medium.
Du kannst aber DVD eineDvd = (DVD) einMedium; machen, dann siest du alle Methoden von DVD.
Wenn du vor hast irgendwas mit reflektion zu machen, dann ist ja dein Konzept falsch. Du kannst höchstens mit instance of prüfen ob das Medium Enke DVD ist.
Ich denke dir fehlen hier etliche Grundlagen oder eben einfach ein Design Fehler.
Hier hast du einmal ein KSKB, dass dir zeigt wie sowas gehen kann (was auch JavaMeister) vorgeschlagen hat.
Java:
importjava.util.Arrays;importjava.util.List;publicclassTest{publicstaticvoidmain(String... args){List<Abstract> list =Arrays.asList(newNormal(),newShouter());for(Abstract a : list){if(a instanceofShout){((Shout) a).shout();}
a.print();}}staticabstractclassAbstract{publicabstractvoidprint();}staticclassNormalextendsAbstract{@Overridepublicvoidprint(){System.out.println("Normal");}}staticclassShouterextendsAbstractimplementsShout{@Overridepublicvoidprint(){System.out.println("Shouter");}@Overridepublicvoidshout(){System.out.println("SHOUT");}}interfaceShout{voidshout();}}
Habe das ganze mit instanceof gemacht. Alternativ hatte ich noch getClass().getSimpleName().equals("Video"). Dann habe ich allerdings in beiden Fällen nach DVD gecastet.
Nimm instanceof und nur instanceof! Alles andere sind instabile Lösungen, die keinen zusätzlichen Nutzen bringen, aber die Komplexität und Fehlernfälligkeit extrem erhöhen.
Alternativ könntest du überlegen, ob du deine Schnittstelle "Medium" nicht erweitern möchtest, um zu gucken, ob ein Medium ein Sonderangebot ist oder nicht...