Einführung in die Programmierung Prof. Dr. Bertrand Meyer

Slides:



Advertisements
Ähnliche Präsentationen
der Universität Oldenburg
Advertisements

der Universität Oldenburg
Kapitel 4 Datenstrukturen
Java: Dynamische Datentypen
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 5 Polymorphismus Sommersemester 2003 Lars Bernard.
Einführung in die OOP in Java
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
1DVG3 - Paint Paint ein Zeichenprogramm. DVG3 - Paint 2 Paint – ein Zeichenprogramm.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
DVG Klassen und Objekte
Wizards & Builders GmbH Einführung in die objektorientierte Programmierung Norbert Abb.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Ein Vortrag im Rahmen des Seminars “Programmiersprachen”
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 14: Mehrfachvererbung.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 13: (Container-)Datenstrukturen.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 13: (Container-)Datenstrukturen.
Entwicklung verteilter Anwendungen I, WS 13/14 Prof. Dr. Herrad Schmidt WS 13/14 Kapitel 1 Folie 2 Microsoft.NET Framework: Quelle:
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.
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
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.
EPROG Tutorium #5 Philipp Effenberger
Übung 4.1 Strukturierte Datentypen
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
Java-Kurs Übung Besprechung der Hausaufgabe Vererbung
Einführung in die Programmierung mit Java
IT2 – WS 2005/20061Nov 14, 2005 Visibility  public: Sichtbar in allen Paketen  protected: Sichtbar innerhalb des Pakets und in den Unterklassen  (default,
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 9: Abstraktion.
Objektorientierte (OO) Programmierung
Programmiersprachen II Vorbesprechung Klausur Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
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.
Programmiersprachen II Fortsetzung Datenstrukturen Einfache Bäume Übung 13 Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
Tutorium Software-Engineering SS14 Florian Manghofer.
Dr. Wolfram Amme, Virtuelle Vererbung, Informatik II, FSU Jena, SS Auflösung von Konflikten bei Mehrfachvererbung Umbenennung mehrdeutiger Methoden.
1 Grundsätze objektorientierter Programmierung. Dr. Wolfram Amme, Grundsätze objektorientierter Programmierung, Informatik II, FSU Jena, SS Objektorientierte.
1 Eine Einführung in die objektorientierte Programmierung.
Softwarepraktikum LEDA/C++ Lehrstuhl fuer Datenstrukturen und effiziente Algorithmen Prof. Naeher Dozent: Daniel Scmitt.
Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lecture 10: Das dynamische Modell und mehr zu Referenzen.
Anforderungen an die neue Datenstruktur
Einführung in die Programmierung Prof. Dr. Bertrand Meyer
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
OOP II.
Java-Kurs - 8. Übung Klassen und Objekte: Vererbung
Einführung in die Programmierung mit Java
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Datentypen: integer, char, string, boolean
Assoziation und Aggregation
Raphael Fischer Informatik II - Übung 06 Raphael Fischer
Algorithmen und Programmierung III
Polymorphie Überladen
Interfaces Definition von Interfaces Verwendung von Interfaces
«Delegierter» Methoden Schablone Funktionszeiger
1. Die rekursive Datenstruktur Liste 1
9. Vererbung und Polymorphie
Tutorstunde 10.
Implementieren von Klassen
Programmiermethodik Übung 11
Polymorphie Überschreiben
Allgemeine Iteration und Rekursion
 Präsentation transkript:

Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 14: Mehrfachvererbung

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

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

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: )

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

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

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.

Zusammengesetzte Figuren

Mehrfachvererbung: Zusammengesetzte Figuren Einfache Figuren Eine zusammengesetzte Figur

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

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

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

(Erinnerung) Definition: Polymorphie, angepasst (aus Lektion 11) 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.

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

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

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)

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

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

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

Wie schreiben wir die Klasse COMPARABLE? deferred class COMPARABLE feature 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 end

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

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

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

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

Mehrfachvererbung: Namenskonflikte ?

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

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 Ungültig: a1.A_f b1.A_f

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 …

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

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

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)

Features verschmelzen B C f + D * aufgeschoben + wirksam

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

Features verschmelzen: wirksame Features B C f + f + f -- f -- D * aufgeschoben + wirksam -- undefiniert

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

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

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

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 39

Verschmelzung von Features: wirksame Features a1: A b1: B c1: C d1: D a1.g b1.f c1.h d1.f g+ A f+ B h+ C g f h f D f- f-

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

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

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

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 44

Teilen und Abgleichung f g A g g_b g g_c C B D 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).

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.

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 ANY LIST C copy ++ is_equal ++ copy C_copy is_equal C_is_equal D 47

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 48

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