Superklassen

Hallo,
ich hab mal ne Frage:
Also ich hab eine abstrakte Klasse, in der ich alle Methoden sammle, die von mehreren Klassen benötigt werden. Mit extends erben diese Klassen also die Methoden. Aber was kann ich machen, wenn ich eine Klasse habe, die schon JDialog extends, die aber auch diese Methoden braucht, soweit ich weiß, kann eine Klasse nur eine Super-Klasse haben. Wie kann ich es programmieren, dass diese Klasse auch diese Methoden bestitzt, oder ist die einzige Möglichkeit, die Superklasse nicht mehr abstrakt zu machen und dann ein Objekt der jetzigen Superklasse zu erstellen?
Viele Grüße
Manny

Hallo,

wenn du nur die Methoden brauchst, nimmst du ein Interface.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo.

ich hab mal ne Frage:
Also ich hab eine abstrakte Klasse, in der ich alle Methoden
sammle, die von mehreren Klassen benötigt werden. Mit extends
erben diese Klassen also die Methoden. Aber was kann ich
machen, wenn ich eine Klasse habe, die schon JDialog extends,
die aber auch diese Methoden braucht, soweit ich weiß, kann
eine Klasse nur eine Super-Klasse haben. Wie kann ich es
programmieren, dass diese Klasse auch diese Methoden bestitzt,
oder ist die einzige Möglichkeit, die Superklasse nicht mehr
abstrakt zu machen und dann ein Objekt der jetzigen
Superklasse zu erstellen?

Du könntest anstelle der abstrakten Klasse ein Interface benutzen und dieses mit „class xy implements z“ einbinden. In dem Interface kannst du dann die Funktionsköpfe angeben, welche die Klasse haben muss. Allerdings kannst du in dem Interface keinen Code einbinden, den müsstest du in jeder implementierenden Klasse reinschreiben.

Sebastian.

Hallo,
danke erstmal für die Antwort!!
Ich hab aber nochmal ne Frage, was bringt mir ein Interface, dass stellt doch nur leere Methoden für mich bereit, oder nicht?
Wenn ich ein Interface benutze, muss ich doch auch gleich die ganzen benötigten Methoden in die Klasse reinkopieren, was bringt mir dann, dass ich ein Interface imlementiere?
Viele Grüße Manny

Hallo.

danke erstmal für die Antwort!!
Ich hab aber nochmal ne Frage, was bringt mir ein Interface,
dass stellt doch nur leere Methoden für mich bereit, oder
nicht?
Wenn ich ein Interface benutze, muss ich doch auch gleich die
ganzen benötigten Methoden in die Klasse reinkopieren, was
bringt mir dann, dass ich ein Interface imlementiere?

Du kannst das Interface als Typ für ein Objekt verwenden. Beispiel:

Interface fahrzeug {
 Point getPosition();
 void fahreNach(Point ziel);
 void baueUnfall();
}

class auto implements fahrzeug {
...
}

class fahrrad implements fahrzeug {
...
}

class garage {
...
void stelleFahrzeugInGarage(fahrzeug x) {
 x.fahreNach(this.koordinaten);
}
...
}

Für die Garage ist es da völlig unerheblich, ob x jetzt ein Auto oder ein Fahrrad ist. Beide können irgendwo hin fahren, nur das ist wichtig.
Dass beide Fahrzeuge vollkommen unterschiedlich fahren, z.B. einmal per Motor und einmal per Pedalkraft, interessiert die Garage nicht. Die Methode könnte also unterschiedlich implementiert sein. Sie könnte aber auch identisch sein. Einzig wichtig ist, dass beide Klassen so eine Methode anbieten.

Sebastian.

Hallo Manfred.

Ich hab aber nochmal ne Frage, was bringt mir ein Interface,
dass stellt doch nur leere Methoden für mich bereit, oder
nicht?

Interfaces sind ein Sicherheitsnetz für Deine Klassen,
denn mit einem Interface sagst Du dem Compiler wie Deine
Methoden genau auszusehen haben. Tipp- und Schreibfehler
werden somit vom Compiler abgefangen.

Wenn ich ein Interface benutze, muss ich doch auch gleich die
ganzen benötigten Methoden in die Klasse reinkopieren, was
bringt mir dann, dass ich ein Interface imlementiere?

Ein Interface ist im Prinzip ein Vertrag , in dem Du
sagst, was Du alles tun kannst, aber nicht wer es genau
tun wird.

Das ist für die spätere Erweiterbarkeit der
Software enorm wichtig. Wenn Du mit Interfaces statt
mit konkreten Klassen arbeitest, „klebst“ Du nicht mehr
an genau dieser Klasse fest und kannst sie einfach durch
eine andere austauschen, die das gleiche tun kann, aber
intern unter Umständen komplett anders arbeitet (z.B.
Wetterdaten von einem australischen Internetserver lädt,
statt wie bisher aus einer lokalen Datei auf Deiner Festplatte).

Mit Interfaces kannst Du in Java auch Funktionen „erben“,
ohne eine Unterklasse bilden zu müssen. Da Java klugerweise
keine Mehrfachvererbung unterstützt, schreibst Du
stattdessen eine Klasse, die das Interface implementiert.
Alle anderen Klassen, die auch das Interface anbieten sollen,
geben die Anfragen an diese Klasse weiter. Das ist wie im
echten Leben, die cleveren Leute delegieren einen
Teil ihrer Arbeit an Spezialisten.

Beispiel:

public class Delegationsbeispiel {
 public static void main(String[] args) {
 // der Mathe-Lehrer ist nur an Fritzchens Rechenkünsten interessiert:
 Addition fritz = new Fritzchen();
 fritz.addiere(5, 4);
 } 
}

interface Addition {
 public int addiere(int a, int b);
}

class Taschenrechner implements Addition {
 public Taschenrechner() {
 }
 public int addiere(int a, int b) {
 return a+b; 
 }
}

class Fritzchen implements Addition {
 // Fritzchen delegiert Mathematik lieber:
 protected Addition \_addition = new Taschenrechner();

 public Fritzchen() {}

 public int addiere(int a, int b) {
 int summe = \_addition.addiere(a,b);
 System.out.println("Heureka! " + a + " + " + b + " = " + summe);
 return summe; 
 }
} 

Beachte, dass hierbei kein Implementierungscode kopiert wurde.
Lediglich die Methodenköpfe des Interface musst Du in jeder Klasse
aufführen. Das macht aber im Normalfall die IDE für Dich, z.B.
Eclipse.

Gruß,
-Andreas.