1 Einführung in die Programmierung Bertrand Meyer Chair of Software Engineering Introduction to Programming – Lecture 17 2 Vorlesung 20: Mehr über Vererbung Chair of Software Engineering Introduction to Programming – Lecture 17 Themen 3 Benutzung von deferred Klassen (Exkurs: Stapel (Stacks) und abstrakte Datentypen) Mehrfachvererbung Die richtige Verwendung von Vererbung Chair of Software Engineering Introduction to Programming – Lecture 17 1 Exkurs: Stapel 4 Elementare Behälterstruktur: “push”- Operation: Feature put Last-In, First-Out (LIFO) Chair of Software Engineering Introduction to Programming – Lecture 17 Stapel 5 Elementare Behälterstruktur: “pop”- Operation: Feature remove Last-In, First-Out (LIFO) Chair of Software Engineering Introduction to Programming – Lecture 17 Stapel 6 Elementare Behälterstruktur: “top”- Operation: Feature item Last-In, First-Out (LIFO) Chair of Software Engineering Introduction to Programming – Lecture 17 2 Stapelspezifikation durch mathematische Funktionen 7 item (put (s, x)) = x remove (put (s, x)) = s put ( s Chair of Software Engineering ) , = x s’ Introduction to Programming – Lecture 17 Abstrakte Datentypen (ADT) 8 Charakterisieren Datenstrukturen durch eine Menge mathematischer Funktionen und ihre abstrakten mathematischen Eigenschaften Theoretische Basis für objekt-orientierte Programmierung (und viele moderne Design- und Programmierungsmethoden) item (put (s, x)) = x remove (put (s, x)) = s Chair of Software Engineering Introduction to Programming – Lecture 17 Nutzen von Stapel 9 Kompilierung, vor allem das Parsen (Syntax und Analysis) x ∗ (a + 2 ∗ b) Betriebssysteme Implementierung von Rekursion (auch Teil der Kompilierung) Chair of Software Engineering Introduction to Programming – Lecture 17 3 Der rekursive Algorithmus von Hanoi 10 move (n: INTEGER; source, target, other: CHARACTER) is -- Move n disks from needle source to target, -- using other as storage. do if n > 0 then move (n−1, source, other, target) transfer (source, target) move (n−1, other, target, source) end end Chair of Software Engineering Introduction to Programming – Lecture 17 Stapelrepräsentation: Array (up) 11 capacity count “Push”- Operation: representation Chair of Software Engineering Introduction to Programming – Lecture 17 Stapelrepräsentation: Array (down) 12 capacity “Push”- Operation: free 1 representation Chair of Software Engineering Introduction to Programming – Lecture 17 4 Stapelrepräsentation: Verknüpfte Liste item previous item previous item 13 previous “Push”- Operation: Chair of Software Engineering Introduction to Programming – Lecture 17 Vererbungshierarchie 14 Deferred Klasse: STACK Effektive Klassen: LINKED_STACK, ARRAYED_STACK etc. Chair of Software Engineering Introduction to Programming – Lecture 17 Die Rolle von deferred Klassen 15 Beschreibung von abstrakten Konzepten unabhängig von der Implementierung Beschreibung gemeinsamer Elemente von verschiedenen Implementierungen Chair of Software Engineering Introduction to Programming – Lecture 17 5 Deferred Klassen in EiffelBase 16 * CONTAINER * BOX * COLLECTION * FINITE * INFINITE * BOUNDED * UNBOUNDED * COUNTABLE * TRAVERSABLE * BAG * SET * TABLE * ACTIVE * HIERARCHICAL * INTEGER_ INTERVAL … * RESIZABLE * INDEXABLE ARRAY STRING * CURSOR_ STRUCTURE HASH_TABLE * DISPENSER * STACK * LINEAR * BILINEAR … * SEQUENCE * QUEUE *: deferred Chair of Software Engineering Introduction to Programming – Lecture 17 Mehrfachvererbung 17 Eine Klasse kann zwei oder mehr Superklassen haben. Beispiele: ASSISTANT erbt von TEACHER und STUDENT. TEACHER STUDENT ASSISTANT Chair of Software Engineering Introduction to Programming – Lecture 17 Das Assistentenbeispiel 18 Das ist ein Fall von wiederholter Vererbung: UNIVERSITY_ PERSON ?? TEACHER STUDENT ASSISTANT Chair of Software Engineering id ?? ???? Introduction to Programming – Lecture 17 6 Häufige Beispiele von Mehrfachvererbung 19 Kombination einzelner Abstraktionen: Restaurant, Waggon Taschenrechner, Uhr Flugzeug, Vermögensgegenstand Chair of Software Engineering Introduction to Programming – Lecture 17 Mehrfachvererbung: Kombination von Abstraktionen * COMPARABLE 20 * NUMERIC INTEGER REAL STRING Chair of Software Engineering DOUBLE COMPLEX Introduction to Programming – Lecture 17 Mehrfachvererbung: Verschachtelte Fenster 21 ‘‘Graphische’’ Features: height, width, change_height, change_width, xpos, ypos, move... ‘‘Hierarchische’’ Features: superwindow, subwindows, change_subwindow, add_subwindow... class WINDOW inherit RECTANGLE TREE [WINDOW] feature ... end Chair of Software Engineering Introduction to Programming – Lecture 17 7 Mehrfachvererbung: Zusammengesetzte Figuren 22 Einfache Figuren Eine zusammengesetzte Figur Chair of Software Engineering Introduction to Programming – Lecture 17 Definition des Begriffs ”zusammengesetzte Figur” LIST [FIGURE] * FIGURE display hide rotate move … count put remove … COMPOSITE_ FIGURE Chair of Software Engineering Introduction to Programming – Lecture 17 Definition des Begriffs ”zusammengesetzte Figur” durch Mehrfachvererbung OPEN_ FIGURE 24 LIST [FIGURE] * FIGURE SEGMENT 23 CLOSED_ FIGURE perimeter* POLYLINE perimeter+ perimeter+ POLYGON ELLIPSE … COMPOSITE_ FIGURE diagonal perimeter++ … RECTANGLE CIRCLE TRIANGLE SQUARE perimeter++ perimeter++ Chair of Software Engineering Introduction to Programming – Lecture 17 8 Eine zusammengesetzte Figur als Liste 25 item start forth Chair of Software Engineering after Introduction to Programming – Lecture 17 Zusammengesetzte Figuren 26 class COMPOSITE_FIGURE inherit FIGURE redefine display, move, rotate, ... end LIST [FIGURE] feature display is do -- Display each constituent figure in turn. from until loop end end start after item.display forth ... Similarly for move, rotate etc. ... end Chair of Software Engineering Introduction to Programming – Lecture 17 Komplexe Figuren 27 Eine einfachere Form der Prozeduren display, move etc. kann durch die Verwendung von Iteratoren erreicht werden. Wir werden lernen, Agenten für diesen Zweck zu verwenden. Chair of Software Engineering Introduction to Programming – Lecture 17 9 Namenskonflikte und Mehrfachvererbung B A foo 28 foo C Chair of Software Engineering Introduction to Programming – Lecture 17 Auflösung von Namenskonflikten B A foo 29 foo rename foo as fog rename foo as zoo C Chair of Software Engineering Introduction to Programming – Lecture 17 Auflösung von Namenskonflikten (Fortsetzung) 30 class C inherit A rename foo as fog end B rename foo as zoo end feature ... Chair of Software Engineering Introduction to Programming – Lecture 17 10 Resultat der Umbenennung 31 a1: A b1: B c1: C ... c1.fog c1.zoo a1.foo b1.foo Ungültig: a1.fog, a1.zoo, b1.zoo, b1.fog, c1.foo Chair of Software Engineering Introduction to Programming – Lecture 17 Eine weitere Anwendung von Umbenennung 32 Verbesserung und Präzisierung der Terminologie für die jeweilige spezifische Klasse. Beispiel: child (TREE); subwindow (WINDOW). Chair of Software Engineering Introduction to Programming – Lecture 17 Mehrfachvererbung: Verschachtelte Fenster 33 ‘‘Graphische’’ Features: height, width, change_height, change_width, xpos, ypos, move... ‘‘Hierarchische’’ Features: superwindow, subwindows, change_subwindow, add_subwindow... class WINDOW inherit RECTANGLE TREE [WINDOW] feature ... end Chair of Software Engineering Introduction to Programming – Lecture 17 11 Die Vernunftehe 34 class ARRAYED_STACK [G] inherit STACK [G] ARRAY [G] feature ... end class LINKED_STACK [G] inherit STACK [G] Das ist umstritten! LINKED_LIST [G] Andere ziehen Klientenbeziehunge n vor feature ... end Chair of Software Engineering Introduction to Programming – Lecture 17 Die richtige Verwendung von Vererbung 35 Zwei Beziehungen: Klient, Vererbung Klientenbeziehungen beschreiben, dass Instanzen von B Informationen über Instanzen von A besitzen müssen. A B C Vererbungsbeziehungen beschreiben, dass jede Instanz von D als Instanz von C gesehen werden kann. Chair of Software Engineering D Introduction to Programming – Lecture 17 Nicht die beste Verwendung... 36 Aus einem weit verbreiteten Software Engineering Buch: Mehrfachvererbung erlaubt mehreren Objekten als Basisobjekte zu agieren und wird in objekt-orientierten Sprachen wie Eiffel (Meyer, 1988) unterstützt. Die Eigenschaften von mehreren verschiedenen Objektklassen können kombiniert werden, um ein neues Objekt darzustellen. Nehmen wir an, dass wir zum Beispiel eine Objektklasse CAR haben, die Informationen über Autos kapselt, und eine Objektklasse PERSON, die Informationen über Menschen kapselt. Wir könnten beide Objektklassen benutzen, um ein neues Objekt CAR-OWNER zu definieren, welches die Attribute von CAR und von PERSON vereinigt. Anpassungen durch Vererbung neigen dazu, dass zusätzliche Funktionalität vererbt wird, was Komponenten ineffizient und unförmig machen kann. Chair of Software Engineering Introduction to Programming – Lecture 17 12 Vererbung? 37 PERSON CAR CAR_OWNER Chair of Software Engineering Introduction to Programming – Lecture 17 Vererbung? ... oder als Klient? PERSON 38 CAR CAR_OWNER Chair of Software Engineering Introduction to Programming – Lecture 17 ”The car-owner” 39 “He has a head like an Austin Mini with the doors open.” (Aus: The Dictionary of Aussie Slang, Five-Mile Press, Melbourne, Australia.) Chair of Software Engineering Introduction to Programming – Lecture 17 13 Klient oder Vererbung? 40 Ausser für den polymorphen Gebrauch ist Vererbung nie vonnöten: Anstatt dass B von A erbt, kann B immer auch ein Attribut vom Typ A (oder expanded A) haben – ausser wenn eine Entität vom Typ A Werte vom Typ B repräsentieren soll. (B) Chair of Software Engineering (A) Introduction to Programming – Lecture 17 Sein ist auch haben! 41 (1) Jeder Softwareingenieur ist auch ein Ingenieur. (2) Jeder Softwareingenieur hat einen Teil in sich selbst, der ein Ingenieur ist. Aber: HABEN IST NICHT IMMER SEIN! Chair of Software Engineering Introduction to Programming – Lecture 17 Würdest Du lieber kaufen oder erben? 42 Ein Fall, wo haben nicht sein ist (z.B. “Klient” ist OK aber Vererbung nicht): Jedes Objekt vom Typ B hat eine Komponente vom Typ A, ABER diese Komponente wird eventuell während der Lebenszeit des Objekts ausgetauscht. Benutze stattdessen die Klientenverbindung: class WINDOW inherit GENERAL_WINDOW WINDOW_IMPLEMENTATION feature ... end Chair of Software Engineering Introduction to Programming – Lecture 17 14 Handles (the bridge pattern) class WINDOW inherit GENERAL_WINDOW 43 display is do feature handle.display (Current) end handle: TOOLKIT ... display* set_handle (t: TOOLKIT) is WINDOW do handle.display (Current) handle := t end ... end Chair of Software Engineering GTK TOOLKIT … MS_ WINDOWS display+ display+ Introduction to Programming – Lecture 17 Weitere Tipps zur Vererbung 44 Vermeide “Taxomanie”: keine Überklassifizierungen. Führe neue Klassen nur ein, wenn sie einer sinnvollen Abstraktion mit eigenen Features (typischerweise Abfragen und Befehle) entsprechen. Warte bei Zweifeln, bis du sicher bist, dass eine neue Klasse benötigt wird. Eine neue Klasse hinzuzufügen, ist ein signifikanter Designentscheid. Chair of Software Engineering Introduction to Programming – Lecture 17 45 Ende Vorlesung 20 Chair of Software Engineering Introduction to Programming – Lecture 17 15