Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
modul:m320_2024:learningunits:lu11:interface [2024/10/22 07:57] – angelegt msuter | modul:m320_2024:learningunits:lu11:interface [2024/10/22 11:13] (aktuell) – [Beispiel: Objekte mit gleichartiger Funktionalität] msuter | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ==== 2. Interface in Python ==== | + | ====== LU11c - Interface in Python |
- | Schnittstellen spielen im Software Engineering eine wichtige Rolle. Wenn eine Anwendung wächst, werden Aktualisierungen und Änderungen an der Codebasis immer schwieriger zu verwalten. Hier erfahren Sie, wie Sie eine // | + | Schnittstellen spielen im Software Engineering eine wichtige Rolle. |
- | \\ | + | Wenn eine Anwendung wächst, werden Aktualisierungen und Änderungen an der Codebasis immer schwieriger zu verwalten. |
- | Grundsätzlich kann eine Schnittstelle als **Vertrag** verstanden werden. Sie definiert eine gewisse Funktionalität durch Methoden. Im Interface wird die Deklaration ohne Implementation festgehalten. (Anmerkung: man spricht oft auch von vollabstrakten Klassen, so z.B. bei C++)\\ | + | Hier erfahren Sie, wie Sie eine // |
- | Diese Funktionalität wird für die korrekte Funktion der Anwendung vorausgesetzt. Die implementierende Klasse nutzt die Deklaration der Schnittstelle, | + | |
- | ---- | + | Grundsätzlich kann eine Schnittstelle als **Vertrag** verstanden werden. |
- | //Beispiel | + | Sie definiert eine gewisse Funktionalität durch Methoden. |
- | Verschieden Objekte, die keine Beziehung zueinander aufweisen müssen, haben eine ähnliche Funktionalität, | + | Im Interface wird die Deklaration ohne Implementation festgehalten. (Anmerkung: man spricht oft auch von vollabstrakten Klassen, so z.B. bei C++) |
+ | |||
+ | Diese Funktionalität wird für die korrekte Funktion der Anwendung vorausgesetzt. Die implementierende Klasse nutzt die Deklaration der Schnittstelle, | ||
+ | |||
+ | ==== Beispiel: Objekte mit gleichartiger Funktionalität | ||
+ | Verschieden Objekte, die keine Beziehung zueinander aufweisen müssen, haben eine ähnliche Funktionalität, | ||
{{modul: | {{modul: | ||
- | //Abb. 7.2:// Klassen mit sinngleicher Funktionalität\\ | + | //Abb: Klassen mit sinngleicher Funktionalität// |
- | \\ | + | |
- | Obwohl die drei Klassen Mensch, Wasserflugzeug und Baum keine gemeinsame Basis (Oberklasse) haben, weisen alle die Fähigkeit '' | + | |
- | {{modul: | + | |
- | //Abb. 7.3: // | + | |
- | \\ | + | |
- | Beachten Sie hier die Darstellung einer Schnittstellen-Beziehung als strichlierte Linie (im Gegensatz zur Vererbung mit durchgezogener Linie).\\ | + | |
- | {{modul: | + | |
- | //Abb. 7.4: //UML-Symbole Vererbung und Schnittstelle | + | |
- | ---- | + | Obwohl die drei Klassen Mensch, Wasserflugzeug und Baum keine gemeinsame Basis (Oberklasse) haben, weisen alle die Fähigkeit '' |
- | Das Beispiel verdeutlicht, | + | |
+ | {{modul: | ||
+ | |||
+ | //Abb: Schnittstellen in UML// | ||
+ | |||
+ | Beachten Sie hier die Darstellung einer Schnittstellen-Beziehung als gestrichelte Linie (im Gegensatz zur Vererbung mit durchgezogener Linie). | ||
+ | |||
+ | {{modul: | ||
+ | |||
+ | //Abb: UML-Symbole Vererbung und Schnittstelle// | ||
+ | |||
+ | |||
+ | Das Beispiel verdeutlicht, | ||
+ | Im Code können entsprechende Objekte diese Funktionalität nutzen. | ||
<code python> | <code python> | ||
a_human_object = Human(" | a_human_object = Human(" | ||
a_human_object.swim() | a_human_object.swim() | ||
··· | ··· | ||
- | a_plane_object = Seaplan(" | + | a_plane_object = Seaplane(" |
a_plane_object.swim() | a_plane_object.swim() | ||
··· | ··· | ||
Zeile 30: | Zeile 41: | ||
a_tree_object.swim() | a_tree_object.swim() | ||
</ | </ | ||
- | Werden diese verschiedenen Objekte in einer Liste eingetragen, | + | Werden diese verschiedenen Objekte in einer Liste eingetragen, |
- | Dieses Verhalten entspricht der Idee der Polymorphie. In Pyton wird das konkret mittels Duck-Typing umgesetzt. | + | |
- | === Das Duck-Typing === | + | Dieses Verhalten entspricht der Idee der Polymorphie. In Pyton wird das konkret mittels |
- | Python kennt das Konstrukt des Interface nicht. Es wird ersetzt durch die Technik des //Duck-Typing//. Es stellt eine Typisierung dar, welche in dynamischen Sprachen verwendet wird. Nebst Python auch bei Perl, Ruby, PHP, Javascript usw., wo der Typ oder die Klasse eines Objekts weniger wichtig ist als die Methode, die es definiert. Mit Duck-Typing überprüfen wir Typen überhaupt nicht. Stattdessen prüfen wir, ob eine bestimmte Methode oder ein bestimmtes Attribut vorhanden ist. | + | |
+ | ===== Das Duck-Typing ===== | ||
+ | <WRAP center round tip 60%> | ||
Der Name // | Der Name // | ||
<color # | <color # | ||
+ | </ | ||
+ | |||
+ | Python kennt das Konstrukt des Interface nicht. | ||
+ | Es wird ersetzt durch die Technik des // | ||
+ | Es stellt eine Typisierung dar, welche in dynamischen Sprachen verwendet wird. | ||
+ | Nebst Python auch bei Perl, Ruby, PHP, Javascript usw., wo der Typ oder die Klasse eines Objekts weniger wichtig ist als die Methode, die es definiert. | ||
+ | Mit Duck-Typing überprüfen wir Typen überhaupt nicht. Stattdessen prüfen wir, ob eine bestimmte Methode oder ein bestimmtes Attribut vorhanden ist. | ||
+ | |||
+ | ==== Wozu Duck-Typing verwenden? ==== | ||
+ | Dank // | ||
+ | Der Vorteil ist, dass dazu keine formale Schnittstelle vorhanden sein muss. | ||
+ | Gleichzeitig ist dies aber auch ein Nachteil, so dass entsprechende Checks eingebaut werden sollten, um Fehler zu vermeiden. | ||
- | === Wozu Duck-Typing verwenden? === | ||
- | Dank // | ||
Das // | Das // | ||
- | === Wie wird Duck-Typing verwendet? | + | ==== Wie wird Duck-Typing verwendet? |
- | Beim Duck-Typing werden beliebige Objekte in einer Liste gesammelt. Wird die Liste traversiert (mit einer for-Schleife), | + | Beim Duck-Typing werden beliebige Objekte in einer Liste gesammelt. |
+ | Wird die Liste traversiert (mit einer for-Schleife), | ||
+ | |||
+ | |||
+ | ==== Beispiel: Umsetzung einer pseudo Schnittstelle mit Duck-Typing ==== | ||
- | ---- | ||
- | //Beispiel 7.4:// Umsetzung einer psydo Schnittselle mit Duck-Typing | ||
<file python> | <file python> | ||
class People: | class People: | ||
Zeile 89: | Zeile 112: | ||
Der Grund dafür liegt darin, dass Python als dynamische Sprache bei Methoden mit derselben Signatur so tut, also ob dafür eine Schnittstelle vorhanden wäre. | Der Grund dafür liegt darin, dass Python als dynamische Sprache bei Methoden mit derselben Signatur so tut, also ob dafür eine Schnittstelle vorhanden wäre. | ||
- | Das passiert automatisch und implizit (=versteckt). Wie bereits erwähnt, wird daher in diesem Zusammenhang von einer // | + | Das passiert automatisch und implizit (=versteckt). |
- | ---- | + | Wie bereits erwähnt, wird daher in diesem Zusammenhang von einer // |
- | //Beispiel | + | |
- | {{modul: | + | === Beispiel: Informelle Schnittstelle |
- | //Abb. 7.5:// Die Schnittstelle '' | + | |
+ | {{modul: | ||
+ | |||
+ | //Abb: Die Schnittstelle '' | ||
---- | ---- | ||
- | [[https:// | + | [[https:// |
\\ | \\ | ||
**Quellen**: | **Quellen**: |