Vererbung Generics und Vererbung

DonMarcoHH

Aktives Mitglied
Moin,

ich hab 3 Klassen:
Gamer<M>
GamerWithGun extends Gamer<Gun>
GamerWithKnife extends Gamer<Knife>

In der Oberklasse werden alle Operationen ausgeführt, die unteren rufen sie nur mit super... auf!
Nun gibt es aber in GamerWithGun und GamerWithKnife eine Methode, die geringfügig anders arbeitet als die Hauptmethode!

Gibts ne Moglichkeit, dass immer die geerbten Methoden ausgeführt werden und nur diese eine Methode (die aber IN einer der geerbten Methoden aufgerufen wird) von der aktuellen Klasse ausgeführt wird? Wenn ja, wie?

Ansonsten muss ich hier ja den ganzen Code in den Unterklassen verdoppeln nur um diese eine Methode auszuführen!
 
Einfach die Methode in der Subclass überschreiben, dann wird automatisch die überschriebene Variante ausgeführt. Wäre es aber nicht günstiger Gun und Kniefe als eigene Klassen (z.B. abgeleitet von Weapon) zu machen und dann der Gamer-Instanz als aktuelle Waffe zu zuweisen?
 
Häh? Du überschreibst nur die Methoden, die anders sind:

Java:
public class Gamer<M>{
   public void yell() { System.out.println("Yeahaheyheyheh!"); }
   public void fight(M m) { System.out.println("Fighting with my " + m); }
}

public class GamerWithGun extends Gamer<Gun> {
   public void fight(Gun gun) { System.out.println("Hasta la vista, baby! " + gun.fire()); }
}

Wenn du jetzt eine Liste Gamer hast, unter denen einige GamerWithGun sind, und du rufst bei allen [c]yell[/c] auf, schreien alle gleich. Rufst du [c]fight[/c] auf, verhalten sich die GamerWithGun anders. Das einzige, was du beachten musst ist, dass wenn du in der Unterklasse einen Typ-Parameter "konkretisierst" (wie [c]M[/c] zu [c]Gun[/c]), dass du dann beim Überschreiben von Methoden u.s.w. auch die konkrete Klasse und nicht den abstrakte Typ-Parameter verwenden musst.

Du kannst auch Gamer und einige seiner Methoden abstrakt machen, so dass jede Unterklasse diese Methoden selbst implementieren muss.
 
Wenn aber Gamer ne Methode hat:
Process und diese ruft die private Methoden Yell und Fight auf (die private sind), GamerWithGun hat nur eine Methode Fight!
Es wird dann GamerWithGun.process aufgerufen, ruft diese ja Gamer.process auf! Und wird in dieser dann nicht Gamer.fight anstatt GamerWithGun.fight aufgerufen?
 
Nein, weil du eine Instanz von GamerWithGun hast. Die originale Methode kann nur explizit durch super.fight() aufgerufen werden.

Ausprobieren würde es zeigen und geht schneller als hier nachfragen ^^
 
Die Methoden darfst du nicht private deklarieren.
Wenn du sie in der Superklasse private deklarierst und auch in der SubKlasse, dann wird auf jeden fall die Fight-Methode in der Superklasse ausgeführt.

Bitte schaue dazu einfach mal via Google "Methoden überschreiben java". Da findest du viele viele Informationen rund ums Überschreiben der super.methoden
 

Zurück
Oben