homedukeOOP mit Java: Schnittstellen und Vererbung Prof. Dr. Uwe Schmidt FH Wedel

Schnittstellen und Vererbung


weiter

Schnittstellen

Motivation
Die Trennung von Schnittstelle und Implementierung kann mit Hilfe von Vererbung und abstakten und konkreten Klassen realisiert werden.
weiter
Beispiel
abstract class Stack {
  abstract Stack push(int i);
  abstract boolean isEmpty();
  ...
}
 
class MyStack extends Stack {
  Stack push(int i) { return ...; }
  boolean isEmpty() { return ...; }
  ...
}
 
class YourStack extends Stack {
  Stack push(int i) { return ...; }
  boolean isEmpty() { return ...; }
  ...
}
weiter
merke
Problem:
Ein Objekt kann möglicherweise viele Schnittstellen unterstützen.
Beispiel
abstract class Size {
  abstract int size();
}
 
class MyStack extends StackSize {
  Stack   push(int i) { return ...; }
  boolean isEmpty()   { return ...; }
  ...
  int     size()      { return ...; }
}
weiter
merke
Mehrfachvererbung wird erforderlich!
weiter
merke
Richtig aber nicht gebräuchlich: Mehrfachbeerbung.
merke
Mehrfachbeerbung von Klassen mit Datenfeldern ist semantisch und implementierungstechnisch nicht einfach zu lösen.
weiter
merke
Mehrfachbeerbung von Klassen mit unterschiedlich implementierten Methoden mit gleicher Signatur ist semantisch und implementierungstechnisch nicht einfach zu lösen.
weiter
gut
Besitzt eine beerbte Klasse weder Datenfelder noch Methodenrümpfe, so entfällt die Problematik bei der Mehrfachbeererbung.
weiter
Lösung
in Java
Schnittstellen
interfaces
 
sind einfache abstrakte Klassen ohne Datenfelder und ohne Methodenrümpfe
weiter
gut
Mehrfachvererbung mit Schnittstellen ist in Java möglich.
Beispiel
interface I {
  void f();
}
 
interface J {
  void g();
}
 
class X implements IJ {
  void f() { ... }
  void g() { ... }
}
weiter
merke
Schnittstellen werden mit implements beerbt.
merke
Es kann eine Liste von Schnittstellen angegeben werden.
merke
Die Reihenfolge ist nicht relevant.
merke
Sollten in zwei Schnittstellen gleiche Methoden deklariert sein, führt dieses weder zu Verständnis- noch zu Implementierungsproblemen.
merke
Neben beliebig vielen Schnittstellen kann genau eine Klasse beerbt werden.
merke
Die Problematik bei der Mehrfachvererbung wird in dem Kapitel über Mehrfachvererbung genauer diskutiert.
weiter
Redesign
für das Stack-Beispiel
Schnittstelle
interface Stack {
  boolean isEmpty();
  Stack   push(int i);
  Stack   pop();
  int     top();
 
  boolean preTop();
  boolean prePop();
}
weiter
weitere Schnitstelle
interface Size {
  int     size();
}
weiter
Default- Implementierungen
abstract class AbstractStack
  implements Stack {
 
  boolean preTop() { ... }
  boolean prePop() { ... }
}
weiter
Konkrete Implementierung
class MyStack
  extends AbstractStack
  implements Size {
 
  boolean isEmpty() { ... }
  Stack push(int i) { ... }
  Stack pop()       { ... }
  int   top()       { ... }
 
  int   size()      { ... }
}
weiter
Referenzen
Schnittstellen bilden Datentypen, wie Klassen und Felder.
Referenzen auf Schnittstellen sind möglich.
weiter
Beispiel
Stack s1 = new MyStack();
Size  s2 = new MyStack();
 
... s1.push(42) ...
... s2.size() ...
weiter
merke
Schnittstellen (interfaces) sind per Definition öffentlich sichtbar (public).
merke
Alle Methodendeklarationen in Schnittstellen sind per Definition öffentlich sichtbar (public).

Letzte Änderung: 12.05.2014
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel