Interfaces Flashcards
Konto-Schnittstelle mit 2 Implementierungen
° Klasse Konto bietet an ihrer Schnittstelle die Operationen: einzahlen, auszahlen, gibSaldo
° Implementierung benutzt eine Feldvariable, um den Saldo zu speichern
- Jede Ein- und Auszahlung verändert den Wert dieser Variablen
° Implementierung könnte eine Liste benutzen:
- Speichert jede Ein- und Auszahlung in einer Liste
- Saldo wird erst berechnet, wenn gibSaldo aufgerufen wird, indem die Ein- und Auszahlungen aufaddiert werden
° Für Klienten verändert sich nichts:
- In beiden Fällen werden die sichtbaren Operationen aufgerufen und erhält die gleichen Ergebnisse
- Objektbenutzung bleibt unverändert
- Operationen des Interfaces genauso aufrufbar wie die einer Klasse
Interface Beispiel
interface Konto { void einzahlen (int betrag); void auszahlen (int betrag); int gibSaldo(); }
Eigenschaften von Interfaces
° Sammlungen von Methodenköpfen
° Alle Methoden in einem Interface sind implizit public
° Enthalten keine Methodenrümpfe
° Definieren keine Felder
° Sind nicht instanziierbar (keine Exemplare)
° werden von Klassen implementiert
Interfaces werden durch Klassen implementiert
° Klasse kann deklarieren, dass sie eine Interface implementiert
° Klasse muss für jede Operation des Interfaces eine Methode anbieten
° sie erfüllt dann das Interface
° Immer wenn ein Objekt mit einem bestimmten Interface erwartet wird, kann eine Referenz auf ein Exemplar einer implementierenden Klasse verwendet werden
Implementation Beispiel
class KontoSimpel implements Konto { private int _saldo; public void einzahlen(int betrag) {...} public void auszahlen(int betrag) {...} public int gibSaldo() {...} }
Auswirkung bei Erzeugung
° Bei der Objekterzeugung muss eine implementierende Klasse angegeben werden
Trennung von Schnittstelle und Implementation mit Interfaces
° Klientenklasse benutzt die Dienstleistungen des Interface und ist dadurch von der konkreten Anbieterklasse entkoppelt
Interface als Spezifikation
° Das Interface Konto ist aus einer Klasse abgeleitet
° Methoden wurden in einem Interface beschrieben
° Interface wird definiert und der Umgang für enen Typ wird festgelegt
° Köpfe der Operationen werden festgelegt (mit Kommentar)
° Interface bildet eine Spezifikation, die Klasse eine mögliche Realisierung
Spezifikation allgemein
° Beschreibung der gewünschten Funktionalität einer (Software-)Einheit
° Was soll die Einheit leisten?
° Aber nicht, wie sie diese Leistung erbringt
° Unterscheidung zwischen:
- informell (natürlichsprachliche)
- formal (z.B. mathematische)
Interface sind auch Typen
° Jede Klasse definiert einen Typ
- durch Schnittstelle (Operationen)
- durch Menger der Exemplare (Wertemenge)
° In Java ist Interface auch als Typ definiert
- durch Schnittstelle
- durch Menge der Exemplare aller Klassen, die dieses Interface erfüllen, d.h. die die Schnittstelle des Interface implementieren
° Für einen Typ im OO Sinne ist wichtig:
- Welche Objekte zur Wertemenge des Typs gehören
- Welche Operationen auf diesen Objekten zulässig ist
- NICHT wie die Operationen implementiert sind
Erweiterter objektorientierter Typbegriff
° Typ definiert das Verhalten von Objekten durch eine Schnittstelle, ohne die Implementation der Operationen und des inneren Zustands festzulegen
° Folge:
- Ein Objekt wird von genau einer Klasse erzeugt
- Da eine Klasse auch mehrere Interfaces erfüllen kann, kann ein Objekt zu mehr als einem Typ gehören
Statischer Typ
° durch deklarierten Typ definiert
° Statisch, weil er zur Übersetzungszeit feststeht
° legt die aufrufbaren Operationen der Varable fest
° Compiler überprüft zur Übersetzungszeit, ob die genannten Operation im statischen Typ defieniert ist
Konto k ; // Konto ist hier der statische Typ von k
k.einzahlen(200); // einzahlen ist hier eine Operation
Dynamischer Typ
° hängt von der Klasse des Objektes ab, auf das die Referenzvariable zur Laufzeit verweist
° bestimmt die Implementation und ist dynamisch in zweierlei Hinsicht:
- kann erst zur Laufzeit ermittelt werden
- kann sich während der Laufzeit ändern
° Objekt hingegen ändert seinen Typ nicht; es bleibt sein Leben lang ein Exemplar seiner Klasse
° Dynamischer Typ einer Variablen entscheidet darüber, welche konkrete Methode bei einem Operationsaufruf ausgeführt wird
° Diese Entscheidung wird erst zur Laufzeit getroffen und wird dynamisches Binden (einer Methode) genannt
k = new KontoSimpel(); //dynamischer Typ von k: KontoSimpel k = new KontoAnders(); // neuer dynamischer Typ von k: KontoAnders
Typtest mit instanceof
° Jedes erzeugte Java-Objekt ist ein Exemplar von genau einer Klasse
° Diese Zugehörigkeit zu der erzeugenden Klasse ändert sich nicht
° Ein Objekt kann mit instanceof überprüft werden welcher Klasse es angehört
° Diese boolesche Operation nennen wir im Folgenden einen Typtest
Konto k; // Konto sei hier ein Interface
…
if (k instanceof KontoSimpel) // wenn k eine gültige Referenz
// auf ein Exemplar der Klasse
// KontoSimpel hält
Typzusicherungen
° Klienten sollten ausschließlich mit dem statischen Typ umgehen
° Bei Situationen in denen Operationen des dynamischen Typs aufgerufen werden müssen, muss der Typ zugesichert werden
° Syntaktisch ähnlich wie eine Typumwandlung bei primitiven Typen
° Weder Objekt noch Objektreferenz werden verändert
Konto k; // Konto sei hier ein Interface
…
if (k instanceof KontoSimpel) // wenn k eine gültige Referenz auf ein
{ // Exemplar der Klasse KontoSimpel hält
KontoSimpel ki = (KontoSimpel)k;
…
// Nun Operationsaufrufe von KontoSimpel möglich