Kategorien
Themen

implements Klasse

Mehrfachvererbung, so wie in c++, gibt es in Java nicht. Das ist auch gut so!
Nehmen wir eine Klasse_A, die die Methode tutwas() besitzt. Die Klasse_B ist von Klasse_A abgeleitet und überschreibt die Methode tutwas(). Die Klasse_C ist ebenfalls von Klasse_A abgeleitet und überschreibt auch tutwas(). Nun habe wir die Klasse_D, die von Klasse_B und Klasse_C abgeleitet wird, Klasse_D wird instanziert und die Methode tutwas() aufgerufen.

Welche Methode? Die von Klasse_A, Klasse_B oder Klasse_C?

Objektorientiert heisst nach meinem Verständnis zuerst „Ein Objekt der Klasse x reagiert auf jede Nachricht (Methode), auf die eine Eltern-Klasse von x reagiert, sinnvoll.“ Damit ist isInstance(), selber aufgerufen, vom Compiler oder Runtime genutzt, eine wichtige Eigenschaft einer Klasse.

MeinAutobus ist eine Instanz der Klasse AutoBus, die von PersonenTransporter und StrassenFahrzeug abgeleitet ist. Beide Klassen sind von der Basisklasse „Fahrzeug“ abgeleitet.

AutoBus soll auf die Nachrichten „gibt-Anzahl-Passagier-Plätze“ (von PersonenTransporter) und „gibt-Schadstoff-Plakette“ (von StrassenFahrzeug) sinnvoll reagieren können. MeinAutobus.isInstance(PersonenTransporter) und MeinAutobus.isInstance(StrassenFahrzeug) sind wahr.

In Java können wir nur von mehreren Interfaces erben, also bauen wir die Vererbungskette über Interfaces auf. Es gibt also ein InterfacePersonenTransporter, ein InterfaceStrassenFahrzeug, ein InterfaceAutoBus, …
Und zu jedem Interface gibt es eine Klasse, die das Interface implementiert und in der alle Methoden, die benötigt werden, programmiert sind.
Solange die Vererbungskette komplett über Interfaces bereitgestellt wird und klar ist, welche Klasse das Interface implementiert, ist es nur einiges an Mehrarbeit.
Braucht man aber eine Klasse, zu der es kein Interface gibt, hat man ein Problem.

Jede Klasse kann zu einem Interface umgewandelt werden. Das kann auch der Compiler recht einfach machen. 

Wenn also bei der Klassen-Definition 
public class AutoBus extends StrassenFahrzeug implements PersonenTransporter
oder auch 
public class AutoBus extends PersonenTransporter implements StrassenFahrzeug
geht würde, wären sinnvolle Vererbungsketten einfacher dazustellen.

Wenn Sie nun glauben, das Ganze seit sehr theoretisch, schauen Sie sich bitte jcifs.smb.SmbFile an, sieht aus wie java.io.File, benutzt man wie java.io.File, hat aber kein java.io.File als Eltern, sondern leitet sich von java.net.URLConnection ab. Mit SmbFile wird auf Samba Shares, also Netzwerk Laufwerken, zugegriffen. In einem Projekt schrieb ich ein Framework, das auf „normalen“ Dateien und solche auf Samba Share zugreifen musste. Glücklicherweise benötigte ich nur wenige Methoden, also ein Interface MyFile erstellt, die Methoden definiert. Und das Interface mit einer Klasse MyFileJFS, die eine Variable vom Typ java.io.File und mit einer Klasse MyFileSamba, die eine Variable vom Typ  jcifs.smb.SmbFile implementiert. Wie die Methoden aussah, können Sie sich sicher vorstellen.

public ReturnType xxx() { return file.xxx()}

Bei den 5 Methoden, die ich von File benötigte, ist es etwas Schreibarbeit, was ist bei komplexen Anforderungen?