Schnittstellen
In Schnittstellen (Interfaces) werden nur Methoden deklariert, aber nicht implementiert. Erst wenn eine Klasse diese Schnittstelle implementieren soll, muss die Methode auch implementiert werden. Dies verhält sich also ähnlich zu den abstrakten Klassen.
Aber im Gegensatz zu abstrakten Klassen kann eine Klasse mehr als eine Schnittstelle implementieren. Dadurch wird die Einfachvererbung wie sie in Java vorzufinden ist aufgeweicht.
Angenommen wir möchten verschiedene Tiere modellieren. Manche Tiere können schwimmen, machne können fliegen, manche können beides. Das heißt, dass wir mit einer einfachen Vererbungsstruktur dies nur schwer oder gar nicht umsetzten können.
classDiagram class Tier { <<abstract>> +hunger: double +essen(pNahrung: String) } class SchwimmTier { <<abstract>> +schwimmen() } class FlugTier { <<abstract>> +fliegen() } class Hund { +schwimmen() } class Adler { +fliegen() } class Ente { +schwimmen() } Tier <|-- SchwimmTier Tier <|-- FlugTier SchwimmTier <|-- Hund FlugTier <|-- Adler SchwimmTier <|-- Ente
Wenn wir uns das Implementationsdiagramm anschauen, dann stellen wir fest, dass Enten eigentlich auch Fliegen können. Das können wir mit einer Verebnungshierachie nur schwer umsetzten.
Aber eigentlich wollen wir auch nur festlegen welche Fähigkeiten schwimmen
und fliegen
die speziellen Tiere haben sollen. Daher bietet es sich hier an Schnittstellen zu verwenden.
classDiagram class Tier { <<abstract>> +hunger: double +essen(pNahrung: String) } class Schwimmer { <<interface>> +schwimmen() } class Flieger { <<interface>> +fliegen() } class Hund { +schwimmen() } class Adler { +fliegen() } class Ente { +schwimmen() +fliegen() } Tier <|-- Hund Tier <|-- Adler Tier <|-- Ente Schwimmer <|.. Hund Schwimmer <|.. Ente Flieger <|.. Ente Flieger <|.. Adler
Im Java Quelltext werden Schnittstellen wie folgt implementiert:
Schnittstellen können ansonsten genau wie abstrakte Klassen im Quelltext verwendet werden. Das heißt, dass keine Objekte direkt von einer Schnittstelle erzeugt werden können, aber die Schnittstelle als Datentyp verwendet werden kann.
Aufgabe: Grafikanwendung
Das folgende Implementationsdiagramm ist gegeben
classDiagram class Kreis { -radius: double +Kreis(pRadius: double) +gibRadius(): double +gibFlaecheninhalt(): double } class Quadrat { -seitenlaenge: double +Quadrat(pSeitenlaenge: double) +getSeitenlaenge(): double +gibFlaecheninhalt(): double } class Flaecheninhalt { <<interface>> +gibFlaecheninhalt(): double } Flaecheninhalt <|.. Kreis Flaecheninhalt <|.. Quadrat
- Beschreibe die Auswirkungen der Schnittstelle Flaecheninhalt auf die Klassen Kreis und Quadrat.
- Erweitere das Implementationsdiagramm um die Schnittstelle Umfang.
- Implementiere die Klassen Kreis und Quadrat und die beiden Schnittstellen Flaecheninhalt und Umfang.
- Ergänze die for-Schleife in der datei Grafikanwendung.java so, dass der Flächeninhalt von allen Objekte im Array f berechnet wird. Befülle dazu das Array f.