Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 14: Mehrfachvererbung.

Slides:



Advertisements
Ähnliche Präsentationen
Objektorientierte Programmierung
Advertisements

Einführung in die Informatik: Programmierung und Software-Entwicklung
Anwendungen des OODM auf die ADB / NDB
B-Bäume.
Objektrelationales Mapping mit JPA Advanced Mapping Jonas Bandi Simon Martinelli.
Objektrelationales Mapping mit JPA Entity Mapping Jonas Bandi Simon Martinelli.
Java: Dynamische Datentypen
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Friedhelm Meyer auf der Heide 1 HEINZ NIXDORF INSTITUTE University of Paderborn Algorithms and Complexity Algorithmen und Komplexität Teil 1: Grundlegende.
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
„Component and Aspect Engineering“
Programmiermethodik SS2007 © 2007 Albert Zündorf, University of Kassel 1 6. Story Driven Modeling Gliederung: 1. Einführung 2. Objektdiagramme zur Analyse.
Programmiermethodik SS2007 © 2007 Albert Zündorf, University of Kassel 1 6. Story Driven Modeling Gliederung: 1. Einführung 2. Objektdiagramme zur Analyse.
Objektorientierte Vererbung
Programmiermethodik SS2007 © 2007 Albert Zündorf, University of Kassel 1 Model View Controller Pattern.
Programmiermethodik SS2007 © 2007 Albert Zündorf, University of Kassel 1 6. Story Driven Modeling Gliederung: 1. Einführung 2. Objektdiagramme zur Analyse.
Proxy Pattern Vorlesung Design Patterns Sieglinde Heinrich
DVG Verkettete Listen Verkettete Listen. DVG Verkettete Listen 2 Primitive Datentypen Vorteile: –werden direkt vom Prozessor unterstützt.
1 Kapitel 8: Datenintegrität. 2 Datenintegrität Statische Bedingung (jeder Zustand) Dynamische Bedingung (bei Zustandsänderung) Bisher: Definition eines.
VS one Veranstalter: VSone Feb. 08 Folie 1 Copyright by XML-Serialisierung zur Persistierung von Objekten Thomas Schissler
Einführung in die Programmierung Wintersemester 2010/11 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
What do these sentences mean?
OO implementieren Teil IV Objekte erzeugen. © René ProbstModul 226IV - 2 Von der Klasse zum Objekt Plan Bau Objekt Klasse Instanzierung Objekt Das Objekt.
Module, Klassen, Verträge
No. 239 Marcel Gnoth, NTeam GmbH Datenstrukturen Das Framework der Jäger und Sammler.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 13: (Container-)Datenstrukturen.
Einführung in die Programmierung
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 13: (Container-)Datenstrukturen.
Projekt Alcatraz Java RMI / Spread - Gruppe A4.
Entity Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Advanced Mapping Persistente Domänenmodelle mit JPA 2.0 und Bean Validation.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Parallel Programming Thread Synchronization. Heute 1. Lösung zu Assignment 2 2. Erstellen und Starten von Threads in Java 3. Das synchronized Schlüsselwort.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 11: Einführung in die Konzepte der Vererbung und Generizität.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 15: Topologisches Sortieren Teil 1: Problemstellung und.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 9: Abstraktion.
Einführung in die Programmierung Prof. Dr. Bertrand Meyer
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 10: Das dynamische Modell und mehr zu Referenzen.
Chair of Software Engineering Einführung in die Programierung Prof. Dr. Bertrand Meyer Lektion 8: Kontrollstrukturen.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 14: Mehrfachvererbung.
Algorithmen und Datenstrukturen Übungsmodul 6
Equals, Hashcode und CompareTo Micha Kessler
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 7: Referenzen und Zuweisungen.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 4: Die Schnittstelle einer Klasse.
Einführung in die Programmierung Prof. Dr. Bertrand Meyer
Einführung in das Wissenschaftliche Arbeiten Andreas Hechenblaickner Programmiersprache Eiffel
Design Patterns Ein Muster (pattern) ist eine Idee, die sich in einem praktischen Kontext als nützlich erwiesen hat und dies auch in anderen sein wird.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 11: Einführung in die Konzepte der Vererbung und Generizität.
Einfache OQL-Ausdrücke (1) Literale und Objekte können direkt konstruiert werden; gültige Ausdrücke und ihre Typen sind z.B.: "Quader77": string struct(x:1.0,
EPROG Tutorium #5 Philipp Effenberger
Common Language Runtime Seminar Softwareentwicklung Wintersemester 2003 Gertraud Orthofer
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Programmierpraktikum Java SS 2005 Mag.Thomas Hilpold.
Einführung in die Programmierung Prof. Dr. Bertrand Meyer
XPath Datenmodell und Sequenzen Universität zu Köln – Historisch-Kulturwissenschaftliche Informationsverarbeitung Datenbanktechnologie – Daniel Ebner –
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 18: Undo/Redo.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 11:Einführung in die Konzepte der Vererbung und Generizität.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 10: Das dynamische Modell und mehr zu Referenzen.
Vererbung in Java. public abstract class Form { protected int breite; protected int hoehe; protected String farbe; /** * Erzeuge eine Form der Breite.
Einführung in die Programmierung Prof. Dr. Bertrand Meyer
Einführung in die Programmierung Prof. Dr. Bertrand Meyer
Einführung in die Programmierung mit Java
OO-Programmierung & Vererbung
Algorithmen und Programmierung III
Polymorphie Überladen
 Präsentation transkript:

Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 14: Mehrfachvererbung

2 Abstraktionen kombinieren Gegeben sind die Klassen EISENBAHNWAGEN, RESTAURANT Wie würden Sie eine Klasse SPEISEWAGEN implementieren?

3 Beispiele von Mehrfachvererbungen Separate Abstraktionen kombinieren: Restaurant, Eisenbahnwagen Taschenrechner, Uhr Flugzeug, Vermögenswert Zuhause, Fahrzeug Tram, Bus

4 Warnung Vergessen Sie alles, was Sie gehört haben! Mehrfachvererbung ist nicht das Werk des Teufels Mehrfachvererbung schadet ihren Zähnen nicht (Auch wenn Microsoft Word sie scheinbar nicht mag: )

5 Dies ist wiederholte Vererbung, nicht Mehrfachvererbung A D B C A D Nicht der allgemeine Fall (Obwohl es häufig vorkommt; warum?)

6 Implizite wiederholte Vererbung In Eiffel, vierfache Vererbung verursacht wiederholte Vererbung: C B D ANY

7 Noch eine Warnung Dieser Teil der Vorlesung orientiert sich an Eiffel Java und C# Mechanismen (Einfachvererbung von Klassen, Mehrfachvererbung von Schnittstellen) werden aber auch behandelt C++ hat unterstützt ebenfalls Mehrfachvererbung, aber ich werde nicht versuchen, diese zu beschreiben.

8 Zusammengesetzte Figuren

9

10 Mehrfachvererbung: Zusammengesetzte Figuren Eine zusammengesetzte Figur Einfache Figuren

11 Den Begriff der zusammengesetzten Figur definieren COMPOSITE_ FIGURE center display hide rotate move … count item before after … put remove … FIGURE LIST [FIGURE ]

12 In der allgemeinen Struktur COMPOSITE_ FIGURE FIGURE LIST [FIGURE ] OPEN_ FIGURE CLOSED_ FIGURE SEGMENTPOLYLINEPOLYGON ELLIPSE RECTANGLE SQUARE CIRCLE TRIANGLE perimeter + perimeter* perimeter ++ diagonal perimeter ++ perimeter +

13 (Erinnerung) Mit polymorphen Datenstrukturen arbeiten bilder: LIST [FIGURE] … across bilder as c loop c item display end Dynamische Binden (POLYGON) (CIRCLE) (POLYGON) (CIRCLE) (ELLIPSE) (aus Lektion 11)

14 (Erinnerung) Definition: Polymorphie, angepasst Eine Bindung (Zuweisung oder Argumentübergabe) ist polymorph, falls ihre Zielvariable und der Quellausdruck verschiedene Typen haben. Eine Entität oder ein Ausdruck ist polymorph, falls sie/er zur Laufzeit in Folge einer polymorphen Bindung zu einem Objekt eines anderen Typs gebunden werden. Eine Container-Datenstruktur ist polymorph, falls sie Referenzen zu Objekten verschiedener Typen enthalten kann. Polymorphie ist die Existenz dieser Möglichkeiten. (aus Lektion 11)

15 Eine zusammengesetzte Figur als Liste c c.item count index 1

16 Zusammengesetzte Figuren class COMPOSITE_FIGURE inherit FIGURE LIST [FIGURE] feature display -- Jede einzelne Figur der Reihenfolge -- nach anzeigen. do across Current as c loop c. item. display end end... Ähnlich für move, rotate etc.... end Benötigt dynamisches Binden

17 Eine Abstraktionsebene höher gehen Eine einfachere Form der Prozeduren display, move etc. kann durch den Gebrauch von Iteratoren erreicht werden. Benutzen Sie dafür Agenten Wir werden diese in ein paar Wochen behandeln (aber Sie dürfen das Kapitel gerne schon im Voraus lesen)

18 Mehrfachvererbung: Abstraktionen kombinieren COMPARABLE NUMERIC STRING COMPLEX INTEGER REAL, >=, … +, –,, / … (totale Ordnungs- beziehung) (kommutativer Ring)

19 Die Lösung von Java und C# Keine Mehrfachvererbung für Klassen Interface: Nur Spezifikationen (aber ohne Verträge) Ähnlich wie komplett aufgeschobene Klassen (ohne wirksame Features) Eine Klasse kann: Von höchstens einer Klasse erben Von beliebig vielen Schnittstellen erben

20 Mehrfachvererbung: Abstraktionen kombinieren COMPARABLE NUMERIC STRING COMPLEX INTEGER REAL, >=, … +, –,, / … (totale Ordnungs- beziehung) (kommutativer Ring)

21 Wie schreiben wir die Klasse COMPARABLE? deferred class COMPARABLE feature end less alias "<" (x : COMPARABLE [G ]): BOOLEAN deferred end less_equal alias "<=" (x : COMPARABLE [G ]): BOOLEAN do Result := (Current < x or (Current ~ x)) end greater alias " >" (x : COMPARABLE [G ]): BOOLEAN do Result := (x < Current) end greater_equal alias " >=" (x : COMPARABLE [G ]): BOOLEAN do Result := (x <= Current) end

22 Die Moral dieses Beispiels Typisches Beispiel für ein lückenhaftes Programm Wir brauchen das volle Spektrum von vollständig abstrakten (aufgeschobenen) Klasse bis zu komplett implementierten Klassen Mehrfachvererbung hilft uns, Abstraktionen zu kombinieren

23 Ein typisches Beispiel aus der Eiffel-Bibliothek class ARRAYED_LIST [G ] inherit LIST [G ] ARRAY [G ] feature … Implementiere LIST -Features mit ARRAY- Features … end For example: i_th (i : INTEGER ): G -- Element mit Index`i. do Result := item (i ) end Feature von ARRAY

24 Man könnte auch Delegation benutzen… class ARRAYED_LIST [G ] inherit LIST [G ] feature rep : ARRAY [G ] … Implementiere LIST –Features mit ARRAY- Features, auf rep angewendet… end Beispiel: i_th (i : INTEGER ): G -- Element mit Index `i. do Result := rep item (i) end

25 Nicht-konforme Vererbung class ARRAYED_LIST [G ] inherit LIST [G ] ARRAY [G ] feature … Implementiere LIST -Features mit ARRAY- Features … end inherit {NONE } ARRAYLIST ARRAYED _LIST Nicht-konforme Vererbung

26 Mehrfachvererbung: Namenskonflikte f C f A B ?

27 Namenskonflikte auflösen f rename f as A_f C f A B A_f, f class C inherit A rename f as A_f end B …

28 Konsequenzen des Umbenennens a1 : A b1 : B c1 : C... c1. f c1. A_f a1. f b1. f rename f as A_f C f A B A_f, f f Ungültig: a1. A_f b1. A_f

29 Redefinition und Umbenennen Redefinition ändert das Feature und behält seinen Namen Umbenennen behält das Feature und ändert seinen Namen Es ist möglich beide zu kombinieren: class B inherit A rename f as A_f redefine A_f end …

30 Noch eine Anwendung von Umbenennungen Eine (lokal) bessere Terminologie ermöglichen. Beispiel: child (TREE ); subwindow (WINDOW)

31 Umbenennungen, um die Terminologie zu verbessern Graphische Features: height, width, x, y, change_height, change_width, move... Hierarchische Features: superwindow, subwindows, change_subwindow, add_subwindow... class WINDOW inherit RECTANGLE TREE [WINDOW] rename parent as superwindow, children as subwindows, add_child as add_subwindow … end feature... end ABER: Siehe Stilregeln betreffend einheitlichen Featurenamen

32 Sind alle Namenskonflikte schlecht? Ein Namenskonflikt muss beseitigt werden, es sei denn, er geschieht: Durch wiederholte Vererbung (d.h. kein wirklicher Konflikt) Zwischen Features, von denen höchstens eines wirksam ist. (d.h. die übrigen sind aufgeschoben)

33 Features verschmelzen ABC D f + f *f * f *f * aufgeschoben + wirksam

34 Features verschmelzen: Mit verschiedenen Namen ABC D h + g *g * f *f * aufgeschoben + wirksam Umbenennung g f h f class D inherit A rename g as f end B C rename h as f end feature... end

35 Features verschmelzen: wirksame Features ABC D f + aufgeschoben + wirksam -- undefiniert f --

36 Undefinition deferred class T inherit S undefine f end feature... end

37 Verschmelzen durch Undefinition class D inherit A undefine f end B undefine f end C feature... end ABC D f + f -- aufgeschoben + wirksam -- undefiniert

38 Verschmelzen von Features mit unterschiedlichen Namen A B C D h + f + g + f -- class D inherit A undefine f end B rename g as f undefine f end C rename h as f end feature... end h f g f

39 Akzeptable Namenskonflikte Wenn geerbte Features alle den gleichen Namen haben, besteht kein schädlicher Namenskonflikt, falls: Sie alle eine kompatible Signatur haben Maximal eines von ihnen wirksam ist Die Semantik eines solchen Falls: Alle Features zu einem verschmelzen Falls es ein wirksames Feature gibt, wird dessen Implementierung übernommen

40 Verschmelzung von Features: wirksame Features a1: Ab1: Bc1: Cd1: D a1.gb1.fc1.hd1.f ABC D g+g+ f+f+h+h+ g f h f f-f-f-f-

41 Ein Spezialfall der Mehrfachvererbung Mehrfachvererbung ermöglicht einer Klasse, zwei oder mehrere Vorfahren zu haben Beispiel: ASSISTENT erbt von DOZENT und STUDENT DOZENT STUDENT ASSISTENT UNIVERSITÄTS_ ANGEHÖRIGER id Dieses Beispiel bedingt wiederholte Vererbung: eine Klasse ist ein Nachkomme einer anderen Klasse in mehr als einer Art (durch mehr als einen Pfad) ?? ????

42 Indirekt und direkt wiederholte Vererbung A D B C A D Auch als «Diamant des Todes» bekannt

43 Mehrfachvererbung ist auch wiederholte Vererbung Ein typischer Fall: copy ++ is_equal ++ copy is_equal ?? copy C_copy is_equal C_is_equal C LIST D ANY

44 Akzeptable Namenskonflikte Wenn geerbte Features alle den gleichen Namen haben, besteht kein schädlicher Namenskonflikt, falls: Sie alle eine kompatible Signatur haben Maximal eines von ihnen wirksam ist Die Semantik eines solchen Falls: Alle Features zu einem verschmelzen Falls es ein wirksames Feature gibt, wird dessen Implementierung übernommen

45 Teilen und Abgleichung Features, wie z.B. f, die auf ihren Vererbungspfaden nicht umbenannt wurden, werden geteilt (shared). Features, wie z.B. g, die unter unterschiedlichem Namen geerbt werden, werden vervielfältigt (replicated). A B C D fgfg g g_b g g_c

46 Wann ist ein Namenskonflikt akzeptabel? (Konflikt zwischen n direkten oder geerbten Features derselben Klasse. Alle Features haben denselben Namen) Sie müssen alle kompatible Signaturen haben. Falls mehr als eines wirksam ist, müssen diese alle vom gleichen Vorfahren (durch wiederholte Vererbung) abstammen.

47 Der Bedarf nach select Eine mögliche Doppeldeutigkeit entsteht durch Polymorphie und dynamisches Binden: a1 : ANY d1 : D … a1 := d1 a1. copy (…) copy ++ is_equal ++ copy C_copy is_equal C_is_equal C LIST D copy is_equal ANY

48 Die Doppeldeutigkeit auflösen class D inherit LIST [T ] select copy, is_equal end C rename copy as C_copy, is_equal as C_is_equal,... end

49 Was wir gesehen haben Einige Spielchen, die man mit Vererbung spielen kann: Mehrfachvererbung Verschmelzen von Features Wiederholte Vererbung