Klassen und ihre Beziehungen: Mehrfache Vererbung, Schnittstellen und Pakete

Ähnliche Dokumente
Klassen und ihre Beziehungen III: Mehrfache Vererbung, Rollen, Schnittstellen und Pakete

Vererbung. Martin Wirsing. Ziele. Vererbung

Klassen und ihre Beziehungen II: Einfache Vererbung und Abhängigkeit

Programmierung Nachklausurtutorium

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

14. Java Objektorientierung. Klassen, Vererbung, Kapselung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Programmierkurs Java

14. Java Objektorientierung

14. Java Objektorientierung

Vererbung. Prof. Dr. Christian Böhm. in Zusammenarbeit mit Gefei Zhang. WS 07/08

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Programmieren in Java

Einstieg in die Informatik mit Java

Implementieren von Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Strategie. (Strategy. / Policy) Ein objektbasiertes Verhaltensmuster. Stephan Munkelt, Stefan Salzmann - 03IN

14 Abstrakte Klassen, finale Klassen, Interfaces

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Programmieren in Java

Praktikum. SEP: Java-Programmierung WS 2018/19. Modularisierung. Thomas Lemberger und Martin Spießl

12 Abstrakte Klassen, finale Klassen und Interfaces

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Algorithmen und Datenstrukturen

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Wiederholung. Klassenhierarchie:

Programmieren 2 Java Überblick

Einstieg in die Informatik mit Java

Vererbung, Polymorphie

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Vorkurs Informatik WiSe 15/16

Programmieren 1 09 Vererbung und Polymorphie

Probeklausur: Programmierung WS04/05

Javakurs für Anfänger

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

Programmieren in Java -Eingangstest-

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Kapitel 5: Interfaces

3 Objektorientierte Konzepte in Java

Grundelemente objektorientierter Sprachen (1)

Informatik II Musterlösung

Objekt-orientierte Programmierung

Grundelemente objektorientierter Sprachen (1)

Grundelemente objektorientierter Sprachen (1)

Einstieg in die Informatik mit Java

1 Abstrakte Klassen, finale Klassen und Interfaces

Objektorientierte Programmierung. Kapitel 14: Interfaces

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Abstrakte Klassen, Interface. DVG Abstrakte Klassen, Interface

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

Programmierkurs C++ Abstrakte Klassen und Methoden

Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Tafelübung 07 Algorithmen und Datenstrukturen

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Javakurs für Anfänger

3 Objektorientierte Konzepte in Java

Einführung in die Programmierung

Info B VL 11: Innere Klassen/Collections

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Ersetzbarkeit und Verhalten

Vererbung. Oberklassen und Unterklassen

Theorie zu Übung 8 Implementierung in Java

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Präsentation Interfaces

Informatik II Übung 06. Benjamin Hepp 5 April 2017

II.4.5 Generische Datentypen - 1 -

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Interfaces

Abschnitt 14: Schnittstellen: Interfaces

Kapitel 4: Klassen und Unterklassen

4. Vererbung Die Klasse Object. Die Klasse Object

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Java für Bauingenieure

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

Algorithmen und Datenstrukturen 07

Abstrakte Basisklassen

Info B VL 8: Abstrakte Klassen & Interfaces

Transkript:

Klassen und ihre Beziehungen: Mehrfache Vererbung, Schnittstellen und Pakete Martin Wirsing in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer SS 06

2 Wichtig: Klausuranmeldung 1. Teilklausur am 16.6.2006! Klausuranmeldung ist für Klausurteilnahme erforderlich! Die Anmeldung zur Klausur ist jetzt über UniWorx möglich. Bitte bis zum 13.6. anmelden.

3 Ziele Den Begriff der einfachen und mehrfachen Vererbung verstehen Schnittstellendeklarationen kennen lernen Pakete zur Strukturierung von Programmsystemen kennen lernen

4 Beziehungen zwischen Klassen C D Vererbung: Die Klasse C ist Erbe der Klasse D C D Abhängigkeit: Die Klasse C benützt Elemente der Klasse D (i.a. Methoden) C D Assoziation: Die Klassen C und D stehen in Beziehung C D (schwache) Aggregation: Jedes Objekt von C enthält Objekte von D

Einfache und mehrfache Vererbung 5 Man spricht von einfacher Vererbung, wenn jede Klasse höchstens eine direkte Superklasse besitzt. Kann eine Klasse mehrere direkte Superklassen haben, spricht man von mehrfacher Vererbung. Beispiel: mehrfache Vererbung Pferd Esel Maultier

6 Einfache und mehrfache Vererbung Beispiel: einfache und mehrfache Vererbung Person einfache Vererbung Verkäufer Manager mehrfache Vererbung Verkaufsmanager Bemerkung: Java unterstützt bei Klassen nur einfache Vererbung.

7 Einfache und mehrfache Vererbung Problem bei mehrfacher Vererbung: mögliche Mehrdeutigkeiten beim Verwenden von Attributen und Methoden: C a geta() D a geta() Welches Attribut a und welche Methode get(a) sollte Z erben und, wenn jeweils beide geerbt werden, welche der Methoden wird beim Aufruf von get(a) ausgewählt? Z

8 Pakete Pakete dienen zur Strukturierung großer Programmsysteme. Ein Paket (Schlüsselwort package ) fasst verwandte Klassen zusammen. pckt Ein Paket hat einen Namen, der mit einem kleinen Buchstaben beginnt, und steht in einem Verzeichnis mit dem gleichen Namen. Alle Klassen eines Pakets pckt stehen in demselben C E D Verzeichnis, aber in unterschiedlichen Dateien. Jede dieser Dateien enthält die Anweisung package pckt; als erste Anweisung. Darstellung in UML: Paket pckt mit 3 Klassen

9 Beispiel Datei: point\point.java package point; public class Point { private int x, y; public Point(int a, int b) {... Klasse im Paket point point Point Benutzung einer Klasse von point Datei: imperativ\pointpckgmain.java package imperativ; import point.point; public class PointPckgMain { public static void main(string[] args) { Point p = new Point(10,20);... imperativ PointPckgMain

10 Benutzung von Paketen Eine einzelne Klasse C eines Pakets pckt kann in einem anderen Paket benutzt werden durch die Anweisung import pckt.c;. Alle Klassen eines Pakets pckt werden benutzt durch import pckt.*;. Klassen unterschiedlicher Pakete pckt1,..., pckt3 werden benutzt durch import pckt1.c; import pckt2.*;. import pckt3.d;.....

11 Benutzung von Paketen: Übersetzung und Ausführung von Programmen point Wähle ein Basisverzeichnis (z.b. mit Namen java0) mit den Unterverzeichnissen point und imperativ, in denen alle Dateien Point jeweils als erste Anweisung package point bzw. package imperativ enthalten. Wechsle in das Verzeichnis java0. Übersetze die Datei PointPackgMain.java mittels java0> javac imperativ\pointpackgmain.java (Windows) Oder java0> javac imperativ/pointpackgmain.java (Unix) imperativ PointPckgMain Führe die Klasse PointPackgMain aus mittels java0> java imperativ.pointpackgmain.

12 Sichtbarkeitsregeln für Identifikatoren pckt1 pckt2 E C private x protected y public z w 4 Möglichkeiten: private, protected, public, kein Modifier D F

13 Sichtbarkeitsregeln für Identifikatoren : private pckt1 pckt2 E C private x protected y public z w private x es kann nur von innerhalb der Klasse C auf x zugegriffen werden. D F

14 Sichtbarkeitsregeln für Identifikatoren : protected pckt2 E pckt1 C private x protected y public z w protected y es kann von jeder Klasse innerhalb pckt1 und von Unterklassen außerhalb von pckt1 auf y zugegriffen werden. D F Aber guter Stil ist es, NUR von C und von Unterklassen von C auf y zuzugreifen! protected kann bei Vererbung private ersetzen. Verwendung von y in F möglich, aber schlechter Stil!

15 Sichtbarkeitsregeln für Identifikatoren : public pckt1 pckt2 E C private x protected y public z w public z es kann von überall auf z zugegriffen werden. ABER schlechter Stil, Instanzvariablen (Attribute) als public zu deklarieren! D F

16 Sichtbarkeitsregeln für Identifikatoren: kein Modifier pckt2 E pckt1 C private x protected y public z w (kein Modifier): auf w kann von jeder Klasse innerhalb von pckt1 zugegriffen werden. Guter Stil ist es, w wie eine private Variable zu behandeln. D F Verwendung von w in D oder F möglich, aber schlechter Stil!

17 Sichtbarkeitsregeln für Identifikatoren Die folgenden Regeln gelten für alle Identifikatoren: Lokale Variablen, Methoden, Klassen,... public es kann von überall darauf zugegriffen werden. Aber beachte Stil! protected es kann von jeder Klasse innerhalb dieses Pakets und von Unterklassen außerhalb des Pakets zugegriffen werden. Aber beachte Stil! private es kann nur von innerhalb der Klasse zugegriffen werden. (keine Beschreibung) es kann von jeder Klasse innerhalb dieses Pakets zugegriffen werden. Aber beachte Stil!

18 Wiederverwendbare Lösungen? Wie kann man eine Klasse, die Dienste für einen speziellen Datentyp anbietet, für andere Datentypen wiederverwenden? Beispiel: Die Klasse NumberSet berechne das Maximum und den Durchschnitt einer Menge von Zahlen. Wie kann man NumberSet verallgemeinern, um für eine Menge von Bankkonten den maximalen und den durchschnittlichen Kontostand berechnen? Oder wie kann man für eine Menge von Punkten den größten Punkt und den Durchschnitt berechnen?.

public class NumberSet { private double sum; private double maximum; private int count; Beispiel NumberSet Konstruiert leere Zahlenmenge 19 public NumberSet() { sum = 0; count = 0; maximum = 0; Fügt x zu der Zahlenmenge hinzu public void add(double x) { sum = sum + x; if (count == 0 maximum < x) maximum = x; count++; public double getmaximum() { return maximum; Berechnet Maximum

Versuch: Modifikation für BankAccount-Objekte 20 public class AccountSet //Modifikation von NumberSet für BankAccount Objekte { private double sum; private BankAccount maximum; Enge Kopplung von private int count; BankAccount und den AccountSet-Operationen!... public void add(bankaccount x) { sum = sum + x.getbalance() ; if (count == 0 maximum.getbalance() < x.getbalance() ) maximum = x; count++; public BankAccount getmaximum() { return maximum; Fügt x zu den Bankkonten hinzu Berechnet Maximum

21 Versuch: Modifikation für Point-Objekte public class PointSet //Modifikation von NumberSet für Point Objekte { private double sum; private Point maximum; Enge Kopplung von private int count; Point und den PointSet-... Operationen! ) public void add(point p) { sum = sum + p.getdistfromzero() ; if (count == 0 maximum.getdistfromzero() < p.getdistfromzero() maximum = p; count++; public Point getmaximum() { return maximum; Berechnet Abstand sqrt(x 2 +y 2 ) vom Ursprung Berechnet Maximum

22 Besser: Verwende Schnittstelle public interface Measurable { double getmeasure(); Allgemeine Schnittstelle für messbare Objekte public class DataSet { private double sum; private Measurable maximum; private int count;... public void add(measurable p) { sum = sum + p.getmeasure() ;... Allgemeine Klasse, die Measurable verwendet, aber NICHT die Implementierungen von Measurable kennt Lose Kopplung mit Implementierung erlaubt Wiederverwendung!

23 Schnittstellen Eine Schnittstelle in Java (Schlüsselwort interface ) deklariert eine Menge von Methoden (ohne Angabe eines Rumpfs) und Konstanten (aber keine Attribute). Man nennt eine Methode ohne Rumpf abstrakte Methode. Im Gegensatz zu Klassen ist Mehrfachvererbung erlaubt, d.h. eine Schnittstelle kann Erbe mehrerer Schnittstellen sein. Eine Klasse C implementiert eine Schnittstelle I, wenn alle Methoden der Schnittstelle in C mit ihrer exakten Funktionalität implementiert werden, und zwar durch öffentliche Methoden. <<interface>> I m 1 ()... m n () + C... + m 1 () + m n () m c

24 Schnittstellen <<interface>> Interface Name Schema: public interface InterfaceName Name { Konstanten MethodenSignaturen // Methodenkoepfe fuer public Methoden public class Name implements InterfaceName { private Attribute public Methoden // mindestens eine konkrete Methode fuer // jede abstrakte Methode aus InterfaceName

25 Schnittstellen Beispiel: (1) Wiederverwendbare Lösung für das Mengenproblem DataSet verwendet die Schnittstelle Measure, die von BankAccount und Point implementiert wird. <<interface>> Measurable DataSet getmeasure() add() getmaximum() implements BankAccountMsr PointMsr BankAccount Point getmeasure() muss in BankAccountMsr und PointMsr implementiert werden

Implementierungen der Schnittstelle Measurable 26 public class BankAccountMsr extends BankAccount implements Measurable { public BankAccountMsr(double b) { super(b); public double getmeasure() { return getbalance(); public class PointMsr extends Point implements Measurable { public PointMsr(int x, int y) { super(x,y); public double getmeasure() { return Math.sqrt(getX()*getX() + gety()*gety());

27 Verwendung der Messoperationen DataSet bankdata = new DataSet(); bankdata.add(new BankAccountMsr(0)); bankdata.add(new BankAccountMsr(10000)); Problem: Nachträgliche enge Kopplung mit BankAccount kann zu vielen Erbenklassen führen System.out.println("Average balance = " + bankdata.getaverage()); Measurable max = bankdata.getmaximum(); System.out.println("Highest balance = " + max.getmeasure()); max.getbalance(); //Fehler, da max vom statischen Typ Measurable!! Man kann eine Bankkonto-Instanz durch Typecast erhalten, wenn die Instanz den passenden Typ besitzt: BankAccountMsr b = (BankAccountMsr)max;

28 Verwendung der Messoperationen (2) Wenn eine Klasse ein Interface implementiert, kann man ein Objekt dieser Klasse in ein Objekt der Schnittstelle konvertieren: PointMsr p = new PointMsr(1,3); max = p; //OK, da PointMsr Measurable implementiert Man kann aber nie eine Schnittstelle instanzieren: max = new Measurable(); // Fehler!! Und einer Schnittstellenvariablen keine Instanz zuweisen, die die Schnittstelle nicht implementiert: max = new Point(); //Fehler, da Point Measurable NICHT // implementiert!!

29 Entwurfsvarianten zur Wiederverwendung mit Schnittstellen 3 Varianten: a) Verwendung der Measurable Schnittstelle durch Erbenklassen (BankAccountMsr, PointMsr,...) der gemessenen Klassen: Gut, wenn pro Klasse nur eine Art von Messung gebraucht wird und die gemessenen Klassen nicht verändert werden sollen (siehe vorhergehende Folien). b) Verwendung von Measurable, aber direkte Änderung des Quellcodes der gemessenen Klasse durch Hinzufügen der Operation getmeasure(): Gut zur Entwurfszeit der gemessenen Klasse und wenn nur eine Art von Messung gebraucht wird; nicht möglich bei Klassen der Java API, die nicht verändert werden können. c) (Strategiemuster) Verwendung einer Schnittstelle Measurer mit Operation getmeasure(object anobject), die das gemessene Objekt als Parameter übergibt. Gut, wenn mehrere Eigenschaften zu messen sind (z.b. Größe der x- Koordinate, Größe der y-koordinate,... bei Point).

30 (b) Schnittstelle für eine Messoperation Wiederverwendbare Lösung für das Mengenproblem durch direkte Änderung des Quellcodes der gemessenen Klasse: <<interface>> Measurable getmeasure() DataSet add() getmaximum() implements BankAccount mit getmeasure Point mit getmeasure getmeasure() wird in BankAccount und Point ergänzt

(b) Ergänzung der Implementierungsklassen 31 public class BankAccount implements Measurable {... <alte BankAccount-Implementierung> public double getmeasure() { return getbalance(); Ergänzung von BankAccount um getmeasure Ergänzung von public class Point implements Measurable Point um {... <alte Point-Implementierung> public double getmeasure() getmeasure { return Math.sqrt(getX()*getX() + gety()*gety());

32 (c ) Schnittstelle für mehrere Messoperationen Das Interface Measurer unterstützt die Verwendung von mehreren Messoperationen auf der gemessenen Klasse Point; die Messklassen implementieren die Operation measure(object o) und benützen Point. Allgemein spricht man von Strategie-Muster. <<interface>> Measurer measure(object o) measurer DataSetR add() getmaximum() implements PointMsrrX Point PointMsrrY Verwendet Point: Lose Kopplung!

33 Das Strategiemuster Das Strategiemuster entkoppelt Objekte von ihrem Verhalten und unterstützt den Austausch von Algorithmen. definiert Schnittstelle für alle unterstützten Algorithmen Klient nutzt Kontext und konkretes Strategieobjekt über Strategieschnittstelle Allgemeine Klasse, die Strategie verwendet <<interface>> Strategy algorithm( ) implements strategy Kontext implementiert einen Algorithmus und verwendet (nicht erbt) konkrete Daten ConcreteStrategyA algorithm( ) ConcreteStrategyB algorithm( )

34 (c ) Beispiel Strategiemuster: Schnittstelle für mehrere Messoperationen public interface Measurer { double measure(object anobject) ; Zu messendes Objekt public class DataSetR { private double sum; private Object maximum; private int count; private Measurer measurer ; public DataSet(Measurer ameasurer) { sum = 0; count = 0; maximum = null; measurer = ameasurer; public void add(object x) { sum = sum + measurer.measure(x) ; if (count == 0 Allgemeine Klasse (Kontext), die Measurer verwendet measurer.measure(maximum) < measurer.measure(x)) maximum = x; count++;...

35 Beispiel Strategiemuster: Implementierungen der Schnittstelle Measurer Benützt Point public class PointMsrrX implements Measurer { public double measure(object anobject) { Point apoint = (Point)anObject; return apoint.getx(); public class PointMsrrY implements Measurer { public double measure(object anobject) { Point apoint = (Point)anObject; return apoint.gety(); Typanpassung: nur Point- Instanzen sind korrekte aktuelle Parameter Beispiel: Verwendung von PointMsrrX

36 Transport zum Flughafen: Das Strategiemuster: Weitere Beispiele Strategien (Optionen) können sein: S-Bahn, Bus, Pkw <<interface>> Strategy algorithm() Transportation2Airport Pkw Bus S-Bahn

37 Datumsformate: Das Strategiemuster: Weitere Beispiele In Deutschland und England werden für das gleiche Datum unterschiedliche Formate verwendet. <<interface>> DateFormatStrategy formatdate(date d) Kontext (Billing System) GermanStrategy UKStrategy SortableStrategy 8. Juni 2006 06/08/2006 2006/06/08

38 Das Strategiemuster: Vorteile/Nachteile Das Strategiemuster entkoppelt Objekte von ihrem Verhalten und unterstützt den Austausch von Algorithmen. Vorteile Es wird eine Familie von Algorithmen definiert. Strategien bieten eine Alternative zur Unterklassenbildung, helfen Mehrfachverzweigungen zu vermeiden und verbessern dadurch die Wiederverwendung. Strategien ermöglichen die Auswahl aus verschiedenen Algorithmen- Implementationen ( Algorithmen-Polymorphie ) und erhöhen dadurch die Flexibilität. Nachteile Klienten müssen die unterschiedlichen Strategien kennen, um zwischen ihnen auswählen zu können. Gegenüber der direkten Implementation der Algorithmen im Klienten erzeugen Strategien zusätzlichen Kommunikationsaufwand zwischen Strategie und Klient. Die Anzahl der Objekte wird erhöht.

39 Schnittstellen zur Simulation mehrfacher Vererbung Die mehrfache Vererbung des Verkaufsmanagers läßt sich in Java durch eine Schnittstelle simulieren: Person <<interface>> Manager authorize() Verkaeufer makecontract() implements VerkaufsManager Hier muss authorize() in VerkaufsManager implementiert werden

40 Bemerkung: Verwendung von Schnittstellen Konstanten in Schnittstellen sind automatisch public final. Beispiel: public interface ComparableConstants { boolean IST_GROESSER = true; boolean IST_KLEINER = false; Die in Schnittstellen deklarierten Methoden sind public! public interface I { void m();... Jede Implementierung von I muss m als public deklarieren: public class C implements I { public void m();...

41 Zusammenfassung Mehrfache Vererbung ist in Java nur für Schnittstellen, aber nicht für Klassen erlaubt. Mehrfache Vererbung bei Klassen kann aber mit Hilfe von Schnittstellen ( interface ) simuliert werden. Pakete dienen zur Strukturierung großer Programmsysteme; sie fassen verwandte Klassen zusammen. Eine Schnittstelle deklariert abstrakte Methoden (Methodenköpfe) und Konstanten. Eine Klasse implementiert eine Schnittstelle, wenn sie alle Methoden der Schnittstelle implementiert. Schnittstellen können mehrfach von anderen Schnittstellen erben. Schnittstellen unterstützen die Wiederverwendung allgemeiner Klassen durch Entkopplung der Parameterklassen. Das Strategiemuster entkoppelt Objekte von ihrem Verhalten und unterstützt den Austausch von Algorithmen.