chair of software engineering einführung in die programmierung prof. dr. bertrand meyer lektion 18:...
TRANSCRIPT
![Page 1: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/1.jpg)
Chair of Software Engineering
Einführung in die Programmierung
Prof. Dr. Bertrand Meyer
Lektion 18:
Mehr über Vererbung und Agenten
![Page 2: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/2.jpg)
2
Themen
Aufgeschobene KlassenEinen Typ erzwingenUndo-Redo (Komando-Muster)Mehrfache VererbungVerträge in der Vererbung
![Page 3: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/3.jpg)
3
.
AufgeschobeneKlassen
![Page 4: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/4.jpg)
4
Die Rolle von aufgeschobenen Klasse
Ausdrücken von abstrakten Konzepten, unabhängig von der Implementation.
Ausdrücken von gemeinsamen Elementen von mehreren Implementationen.
Terminologie: wirksam = nicht aufgeschoben(d.h. vollständig implementiert)
![Page 5: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/5.jpg)
5
Beispielhierarchie
FIGURE*
OPEN_ FIGURE
*CLOSED
_ FIGURE
*
SEGMENT
POLYLINE
POLYGON ELLIPSE
CIRCLE
RECTANGLETRIANGL
E
SQUARE
center * display *rotate*
perimeter *
perimeter +
perimeter +
perimeter ++
diagonal
......
perimeter +
+
++
side2
* aufgeschoben
+ wirksam
++ redefiniert
perimeter ++
side1
![Page 6: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/6.jpg)
6
Aufgeschobene Klassen in EiffelBase
CONTAINER*
BOX* COLLECTION* TRAVERSABLE
*
FINITE* INFINITE*
BOUNDED* UNBOUNDED
* COUNTABLE*
RESIZABLE*
BAG* SET* HIERARCHICAL
* LINEAR*
TABLE* ACTIVE* INTEGER_ INTERVAL
* BILINEAR*
INDEXABLE*CU RSO R_
STRU CTU RE
CURSOR_ STRUCTURE
* DISPENSER* SEQUENCE*
ARRAY STRING HASH_TABLE STACK* QUEUE*
… …
* aufgeschoben
![Page 7: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/7.jpg)
7
Ein aufgeschobenes Feature
In ITERATION_CURSOR and LIST:
forth
deferred
end
ensureindex = old index + 1
requirenot after
![Page 8: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/8.jpg)
8
aufgeschoben
Aufgeschobene und wirksame Features mischenIn der gleichen Klasse
search (x : G)-- Gehe zur ersten Position nach der-- aktuellen, wo x auftritt, oder after -- falls es nicht auftritt.
do from until after or else item = x loop
forth endend
“Programme mit Lücken“
wirksam!
![Page 9: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/9.jpg)
9
“Rufen sie uns nicht auf, wir rufen sie auf!”
Eine mächtige Form von Wiederverwendbarkeit: Das wiederverwendbare Element definiert ein
allgemeines Schema. Spezifische Fälle füllen die Lücken in diesem
Schema
Kombiniert Wiederverwendung mit Adaption
![Page 10: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/10.jpg)
10
Aufgeschobene Klassen vs. Java-Schnittstellen
Schnittstellen sind „vollständig aufgeschoben“:nur aufgeschobene Features
Aufgeschobene Klassen können wirksame Features beinhalten, die auf aufgeschobene zugreifen, wie etwa im COMPARABLE-Beispiel
Flexibler Mechanismus, um Abstraktionen schrittweise zu implementieren
![Page 11: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/11.jpg)
11
Anwendungen von aufgeschobenen Klassen
Abstraktion
Systematik
Analyse und Entwurf auf einer hohen Ebene
…
![Page 12: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/12.jpg)
12
Analysis-Beispiel: Fernsehstation
class SCHEDULE featuresegments : LIST [SEGMENT]
end
Quelle: Object-Oriented Software Construction, 2nd edition, Prentice
Hall
![Page 13: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/13.jpg)
13
Programme
noteBeschreibung :“ 24-Stunden TV
Programm”deferred class SCHEDULE feature
segments : LIST [SEGMENT ]
-- Folge von Segmenten.
deferredend
air_time : DATE -- 24-Stunden-Periode -- für dieses Programm.
deferredend
set_air_time (t : DATE) -- Zuweisung des
Programms, -- das zur Zeit t
ausgestrahlt wird.require t.in_futuredeferredensure air_time = tend
print -- Papier-Ausgabe
drucken.deferredend
end
![Page 14: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/14.jpg)
14
Segment
noteBeschreibung: "Individuelle
Fragmente eines Programms "deferred class SEGMENT feature
schedule : SCHEDULE deferred end
-- Programm, zu welchem das
-- Segment gehört.index : INTEGER deferred end
-- Position des Segment-- in seinem Programm.
starting_time, ending_time :INTEGER deferred end-- Beginn und Ende der-- geplanten
Ausstrahlungszeit.next: SEGMENT deferred end
-- Segment, das als nächstes
-- ausgestrahlt wird (falls vorh.).
sponsor : COMPANY deferred end-- Hauptsponsor des Segments.
rating : INTEGER deferred end-- Einstufung (geeignet für Kinder etc.).
Befehle wiechange_next, set_sponsor, set_rating, nicht eingeschlossen
Minimum_duration : INTEGER = 30-- Minimale Länge des Segmentes,-- in Sekunden.
Maximum_interval : INTEGER = 2-- Maximale Zeit zwischen zwei-- aufeinanderfolgenden -- Segmenten, in Sekunden.
![Page 15: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/15.jpg)
15
Segment (fortgesetzt)
invariant
in_list: (1 <= index) and (index <= schedule.segments.count)
in_schedule: schedule.segments.item (index) = Current
next_in_list: (next /= Void ) implies
(schedule.segments.item (index + 1 ) = next)
no_next_iff_last: (next = Void ) = (index = schedule.segments.count)
non_negative_rating: rating >= 0
positive_times: (starting_time > 0 ) and (ending_time > 0)
sufficient_duration:ending_time – starting_time >= Minimum_duration
decent_interval :(next.starting_time) - ending_time <= Maximum_interval
end
![Page 16: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/16.jpg)
16
Werbung
noteBeschreibung:
„Werbeblock"deferred class COMMERCIAL inherit
SEGMENT rename sponsor as advertizer
end
featureprimary : PROGRAM deferred
-- Programm, zu welchem die -- Werbung gehört.
primary_index : INTEGER deferred-- Index von 'primary´.
set_primary (p : PROGRAM)-- Werbung zu p
hinzufügen.require
program_exists: p /= Void
same_schedule: p.schedule = schedule
before: p.starting_time <= starting_timedeferredensure
index_updated: primary_index =
p.indexprimary_updated: primary
= pend
![Page 17: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/17.jpg)
17
Werbung (fortgesetzt)
invariantmeaningful_primary_index: primary_index = primary.indexprimary_before: primary.starting_time <= starting_timeacceptable_sponsor: advertizer.compatible (primary.sponsor)acceptable_rating: rating <= primary.rating
end
![Page 18: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/18.jpg)
18
Beispiel: Chemisches Kraftwerk
deferred classVAT
inheritTANK
featurein_valve, out_valve : VALVE
-- Fülle den Tank.require
in_valve.openout_valve.closed
deferredensure
in_valve.closedout_valve.closedis_full
end
empty, is_full, is_empty, gauge, maximum, ... [Andere Features] ...
invariantis_full = (gauge >= 0.97 * maximum) and (gauge <= 1.03 *
maximum)end
![Page 19: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/19.jpg)
19
Was wir gesehen haben
Aufgeschobene Klassen und ihre Rolle in Softwareanalyse und –entwurf
![Page 20: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/20.jpg)
20
.
Undo-Redo
![Page 21: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/21.jpg)
21
![Page 22: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/22.jpg)
22
Ein Beispiel: Undo-Redo
Undo/Redo sinnvoll in jeder interaktiven Anwendung Entwickeln Sie keine interaktiven
Anwendungen, ohne Undo/Redo zu implementieren
Nützliches Design-Pattern (“Command” Pattern) Veranschaulicht die Verwendung von Algorithmen und DatastrukturenBeispiel für O-O Techniken: Vererbung, Aufgeschobene Klassen, Polymorphe Datenstrukturen, Dynamisches Binden,…Beispiel einer schönen und eleganten LösungReferenzen:
Kapitel 21 in Object-Oriented Software Construction, Prentice Hall, 1997
Erich Gamma et al., Design Patterns, Addison –Wesley, 1995: “Command pattern”
![Page 23: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/23.jpg)
23
Die Problemstellung
Dem Benutzer eines interaktiven Systems die Möglichkeit geben, die letzte Aktion rückgängig zu machen
Bekannt als “Control-Z”
Soll mehrstufiges rückgängig Machen (“Control-Z”) und Wiederholen (“Control-Y”) ohne Limitierung unterstützen, ausser der Benutzer gibt eine maximale Tiefe an
![Page 24: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/24.jpg)
24
In unserem Beispiel: Ein Texteditor
Begriff der „aktuellen Zeile“ mit folgenden Befehlen:
Löschen der aktuellen Zeile Ersetzen der aktuellen Zeile mit einer Anderen Einfügen einer Zeile vor der aktuellen Position Vertauschen der aktuellen Zeile mit der
Nächsten (falls vorhanden) „Globales Suchen und Ersetzen“ (fortan GSE):
Jedes Auftreten einer gewissen Zeichenkette durch eine andere ersetzen
...
Der Einfachheit halber nutzen wir eine zeilenorientierte Ansicht, aber die Diskussion kann auch auf kompliziertere Ansichten angewendet werden
![Page 25: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/25.jpg)
25
Eine einfache Lösung
Sichern des gesamten Zustandes vor jeder Operation
Im Beispiel: Der Text, der bearbeitet wird und die aktuelle Position im Text
Wenn der Benutzer ein „Undo“ verlangt, stelle den zuletzt gesicherten Zustand wieder her
Aber: Verschwendung von Ressource, insbesondere Speicherplatz
Intuition: Sichere nur die Änderungen (diff) zwischen zwei Zuständen
![Page 26: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/26.jpg)
26
Schlüsselschritt im Entwerfen einer Software-Architektur
Hier:
Der Begriff eines “Befehls”
Die richtigen Abstraktionen finden
(die interessanten Objekt-Typen)
![Page 27: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/27.jpg)
27
Die „Geschichte“ einer Sitzung speichern
Die Geschichte-Liste:
history : LIST [COMMAND]
Removal
ExchangeInsertion
Insertion
Insertion
Ältester
Neuster
![Page 28: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/28.jpg)
28
Was ist ein “Command” (Befehl) -Objekt?
Ein Befehl-Objekt beinhaltet genügend Informationen über eine Ausführung eines Befehls durch den Benutzer, um
Den Befehl auszuführen Den Befehl rückgängig zu machen
Beispiel: In einem “Removal”-Objekt brauchen wir:
• Die Position der zu löschenden Zeile
• Der Inhalt dieser Zeile!
![Page 29: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/29.jpg)
29
Allgemeiner Begriff eines Befehls
deferredclass
COMMAND
feature
execute -- Eine Ausführung des Befehls ausführen.
undo -- Eine frühere Ausführung des Befehls rückgängig machen.
end
deferred
:end
deferredend
done: BOOLEAN -- Wurde dieser Befehl
ausgeführt?
ensure already: done
require already: done
![Page 30: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/30.jpg)
30
Die Befehl-Klassenhierarchie
execute*
undo*
…
execute+
undo+
line: STRINGindex: INTEGER
...
execute+
undo+
index
...
*COMMAN
D
+REMOVAL
+INSERTION
* aufgeschoben
+ wirksam
![Page 31: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/31.jpg)
31
Zugrundeliegende Klasse (Aus dem Geschäftsmodell)class EDIT_CONTROLLER feature
text : LIST [STRING]position: ITERATION_CURSOR [STRING]remove
-- Lösche Zeile an aktueller Position.require
not offdo
position.removeend
put_right (line : STRING)-- Füge line nach der aktuellen Position
ein.require
not afterdo
position.put_right (line)end
... Auch: item, index, go_ith, put_left ...end
![Page 32: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/32.jpg)
32
Eine Befehlsklasse (Skizze, ohne Verträge)
class REMOVAL inherit COMMAND featurecontroller : EDIT_CONTROLLER
-- Zugriff auf das Geschäftsmodell.
line : STRING-- Zu löschende Zeile.
index : INTEGER-- Position der zu löschenden Zeile.
execute-- Lösche aktuelle Zeile und speichere sie.
do line := controller.item ; index := controller.indexcontroller.remove ; done := True
end
undo-- Füge vorher gelöschte Zeile wieder ein.
do controller.go_i_th (index)controller.put_left (line)
endend
![Page 33: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/33.jpg)
33
Die Geschichte-Liste
Eine polymorphe Datenstruktur
history: LIST [COMMAND]
Removal
ExchangeInsertion
Insertion
Insertion
Ältester
Neuester
![Page 34: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/34.jpg)
34
Erinnerung: Liste von Figuren
bilder : LIST [FIGURE
]p1, p2 : POLYGONc1, c2 : CIRCLEe : ELLIPSE
class LIST [G ] feature
extend (v : G) do … end
last : G…
end
bilder.extend (p1 ) ; bilder.extend (c1 ) ; bilder.extend (c2 )
bilder.extend (e ) ; bilder.extend (p2 )
(POLYGON) (CIRCLE) (POLYGON)(CIRCLE) (ELLIPSE)
![Page 35: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/35.jpg)
35
Die Geschichte-Liste
Eine polymorphe Datenstruktur
history : LIST [COMMAND]
cursor: ITERATION_CURSOR [COMMAND]
Removal
ExchangeInsertion
Insertion
Insertion
Ältester
Neuester
![Page 36: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/36.jpg)
36
Einen Benutzerbefehl ausführen
decode_user_request
if “Anfrage ist normaler Befehl” then“Erzeuge ein Befehlsobjekt c , der Anforderung
entsprechend”history.extend (c)c.execute
elseif “Anfrage ist UNDO” then
if not cursor.before then -- Ignoriere überschüssige Anfragen
cursor.item.undo cursor.backend
elseif “Anfrage ist REDO” then
if not cursor.is_last then -- Ignoriere überschüssige Anfragen cursor.forth
cursor.item.execute end
end
item
Pseudocode, siehe nächste Implementation
Removal ExchangeInsertion Insertion
![Page 37: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/37.jpg)
37
Die Befehl-Klassenhierarchie
execute*
undo*
…
execute+
undo+
line: STRINGindex: INTEGER
...
execute+
undo+
index
...
*COMMAN
D
+REMOVAL
+INSERTION
* aufgeschoben
+ wirksam
![Page 38: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/38.jpg)
38
Befehlsobjekte erzeugen: Erster Ansatz
c : COMMAND
...
decode_user_request
if “Anfrage ist Removal” then
create {REMOVAL} c
elseif “Anfrage ist Insertion” then
create {INSERTION} celse
etc.
![Page 39: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/39.jpg)
39
Befehlsobjekte erzeugen: Besserer Ansatz«Befehl-Factory»
Geben Sie jedem Befehls-Typ eineNummer
Füllen Sie zu Beginn einen Arraybefehle mit je einer Instanz jedesBefehls-Typen.
Um neue Befehlsobjekte zu erhalten:
“Bestimme command_type”
c := (commands [command_type]).twin
Removal
Insertion
Exchange
...
1
2
n
command_type
Einen “Prototypen” duplizieren
commands
3
![Page 40: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/40.jpg)
40
Der Gebrauch von Agenten
Für jeden Benutzerbefehl haben wir zwei Routinen:
Die Routine, um ihn auszuführen Die Routine, um ihn rückgängig zu machen
![Page 41: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/41.jpg)
41
Die Geschichte-Liste im Undo/Redo-Pattern
history: LIST [COMMAND]
Ältester Neuester
Löschung
Aus-tausch
Einfügung
Einfügung
![Page 42: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/42.jpg)
42
Die Geschichte-Liste mit Agenten
Die Geschichte wird einfach zu einer Liste von Agentenpaaren:
history: LIST [TUPLE
[execute : PROCEDURE [ANY, TUPLE];
undo : PROCEDURE [ANY, TUPLE]]
Das Grundschema bleibt dasselbe, aber man braucht nun keine Befehlsobjekte mehr; die Geschichte-Liste ist einfach eine Liste, die Agenten enthält
Einfügung
Einfügung
Löschung
Austauschen
Einfügung
Entfernen
Entfernen
Wieder-Einfügun
g
Austauschen
Entfernen
Benanntes Tupel
![Page 43: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/43.jpg)
43
Einen Benutzerbefehl ausführen (vorher)
decode_user_request
if “Anfrage ist normaler Befehl” then“Erzeuge ein Befehlsobjekt c , der Anforderung
entsprechend”history.extend (c)c.execute
elseif “Anfrage ist UNDO” then
if not cursor.before then -- Ignoriere überschüssige Anfragen
cursor.item.undo cursor.backend
elseif “Anfrage ist REDO” then
if not cursor.is_last then -- Ignoriere überschüssige Anfragen cursor.forth
cursor.item.execute end
end
item
Removal ExchangeInsertion Insertion
![Page 44: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/44.jpg)
44
Einen Benutzerbefehl ausführen (jetzt)
“Dekodiere Benutzeranfrage mit zwei Agenten do_it and undo_it ”if “Anfrage ist normaler Befehl” then
from until cursorlis_last loop cursorlremove_right endhistorylextend ([do_it, undo_it ]) ; cursorlforthdo_itlcall ([])
elseif “Anfrage ist UNDO” thenif not cursorlbefore then -- Ignoriere überschüssige
Anfragen cursorlitemlexecutelcall ([]) cursorlbackend
elseif “Anfrage ist REDO” thenif not cursorlis_last then –– Ignoriere überschüssige
Anfragen cursorlforth cursorlitemlundolcall ([]) end
end
Einfügung Einfügung Löschung Austausch
Entfernung Entfernung Wiedereinf. Austausch
![Page 45: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/45.jpg)
45
Erinnerung: das Beobachter-Muster
HERAUSGEBER
*
HER_1
SUBSKRIBENT
*
SUB_1
aktualisiere *
aktualisiere +
subskribiere +
bestelle_ab +
subskribenten: LIST […]
melde_anmelde_ab
+ +SUB_2
…
HER_2
…
gebe_heraus +
aktualisiere +
aufgeschoben (deferred)
wirksam (effective)
*+
Erbt von
Kunde (benutzt)
![Page 46: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/46.jpg)
46
Erinnerung: Ereignis-orientierte Programmierung mit Agenten
Die Subskribenten (Beobachter) registrieren sich bei Ereignissen:
Zurich_map.left_click.subscribe (agent find_station)
Der Herausgeber (Subjekt) löst ein Ereignis aus:
left_click.publish ([x_positition, y_position])
Jemand (normalerweise der Herausgeber) definiert den Ereignis-Typ:
left_click : EVENT_TYPE [TUPLE [INTEGER, INTEGER]]-- „Linker Mausklick“-Ereignisse
oncecreate Result
ensureexists: Result /= Void
end
![Page 47: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/47.jpg)
47
Das Undo/Redo- (bzw. Command-) Pattern
Wurde extensiv genutzt (z.B. in EiffelStudio und anderen Eiffel-Tools).Ziemlich einfach zu implementieren.Details müssen genau betrachtet werden (z.B. lassen sich manche Befehle nicht rückgängig machen).Eleganter Gebrauch von O-O-Techniken
Nachteil: Explosion kleiner Klassen
![Page 48: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/48.jpg)
48
Was wir gesehen haben
Menschen machen Fehler!Auch wenn sie keine Fehler machen: sie wollen experimentieren. Undo/Redo unterstützt einen „trial and error“-Stil.
Undo/Redo-Pattern: Sehr nützlich in der Praxis Weit verbreitet Ziemlich einfach zu implementieren Exzellentes Beispiel von eleganten O-O-Techniken Mit Agenten noch besser!
![Page 49: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/49.jpg)
49
.
Einen Typerzwingen
![Page 50: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/50.jpg)
50
Beispielhierarchie
FIGURE*
OPEN_ FIGURE
*CLOSED
_ FIGURE
*
SEGMENT
POLYLINE
POLYGON ELLIPSE
CIRCLE
RECTANGLETRIANGL
E
SQUARE
center * display *rotate*
perimeter *
perimeter +
perimeter +
perimeter ++
diagonal
......
perimeter +
+
++
side2
* aufgeschoben
+ wirksam
++ redefiniert
perimeter ++
side1
![Page 51: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/51.jpg)
51
Einen Typ erzwingen: Das Problem
bilder.store (“FN")
...-- Zwei Jahre später:
bilder := retrieved (“FN") – Siehe nachherx := bilder.last -- [1]print (x.diagonal ) -- [2]
Was ist daran falsch?
Falls x als RECTANGLE deklariert ist, ist [1] ungültig
Falls x als FIGURE deklariert ist, ist [2] ungültig
![Page 52: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/52.jpg)
52
“ Object-Test Local’”
Einen Typ erzwingen: Der Objekt-Test
if attached {RECTANGLE} bilder.retrieved ("FN") as r then
print (r.diagonal )
-- Tu irgendwas mit r, welches garantiert nicht
-- Void und vom dynamischen Typ RECTANGLE ist.
elseprint ("Too bad.")
end
Zu prüfender Ausdruck
SCOPE der Object-Local
![Page 53: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/53.jpg)
53
Früherer Mechanismus: Zuweisungsversuch
f : FIGUREr : RECTANGLE...
bilder.retrieve ("FN")
f := bilder.last
r ?= f
if r /= Void then
print (r.diagonal )else
print ("Too bad.")end
![Page 54: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/54.jpg)
54
Zuweisungsversuch (veraltetes Konstrukt)
x ?= y
mit
x : A
Semantik: Falls y an ein Objekt gebunden ist, dessen Typ
konform zu A ist: Ausführung einer normalen Referenzzuweisung
Sonst: Mache x Void
![Page 55: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/55.jpg)
55
.
Verträge&
Vererbung
![Page 56: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/56.jpg)
56
Verträge und Vererbung
Problem: Was passiert bei Vererbung mit
Klasseninvarianten?
Vor- und Nachbedingungen von Routinen?
![Page 57: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/57.jpg)
57
Invarianten
Vererbungsregel für Invarianten: Die Invariante einer Klasse beinhaltet
automatisch die Invarianten aller Vorfahren, „ver-und-et“.
Die kumulierten Invarianten sind in der flachen Ansicht und der Schnittstellen-Ansicht in Eiffelstudio ersichtlich.
![Page 58: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/58.jpg)
58
Verträge und Vererbung
rrequire
ensure
rrequire
ensure
a1 : A
a1.r (…)…
Korrekter Aufruf in C:
if a1. then
a1.r (...)
-- Hier ist a1. erfüllt. end
r ++
C A
D B
Klient von
erbt von
++ Redefinition
![Page 59: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/59.jpg)
59
Neudeklarierungsregel für Zusicherungen
Wenn eine Routine neu deklariert wird, darf man nur:
Die Vorbedingung beibehalten oder schwächen
Die Nachbedingung beibehalten oder stärken
![Page 60: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/60.jpg)
60
Neudeklarierungsregel für Zusicherungen in Eiffel
Eine simple Sprachregel genügt!
Redefinierte Versionen dürfen keine Vertragsklausel haben (Dann bleiben die Zusicherungen gleich) oder
require else new_preensure then new_post
Die resultierenden Zusicherungen sind: original_precondition or new_pre
original_postcondition and new_post
![Page 61: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/61.jpg)
61
.
MehrfacheVererbung
![Page 62: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/62.jpg)
62
Abstraktionen kombinieren
Gegeben sind die Klassen
EISENBAHNWAGEN, RESTAURANT
Wie würden Sie eine Klasse SPEISEWAGEN implementieren?
![Page 63: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/63.jpg)
63
Beispiele von Mehrfachvererbungen
Separate Abstraktionen kombinieren:
Restaurant, Eisenbahnwagen Taschenrechner, Uhr Flugzeug, Vermögenswert Zuhause, Fahrzeug Tram, Bus
![Page 64: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/64.jpg)
64
Warnung
Vergessen Sie alles, was Sie gehört haben!Mehrfachvererbung ist nicht das Werk des
TeufelsMehrfachvererbung schadet ihren Zähnen
nicht(Auch wenn Microsoft Word sie scheinbar nicht mag:
)
![Page 65: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/65.jpg)
65
Dies ist wiederholte Vererbung, nicht Mehrfachvererbung
A
D
B C
A
D
Nicht der allgemeine Fall
(Obwohl es häufig vorkommt; warum?)
![Page 66: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/66.jpg)
66
Implizite wiederholte Vererbung
In Eiffel, vierfache Vererbung verursacht wiederholte Vererbung:
CB
D
ANY
![Page 67: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/67.jpg)
67
Mehrfachvererbung: die Java und .NET Lösung
Nur Einfachvererbung für KlassenMehrfachvererbung von Schnittstellen
Eine Schnittstelle entspricht einer vollständig aufgeschobenen Klasse, ohne Implementationen (ohne do Klauseln) und Attribute (und auch ohne Verträge)
![Page 68: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/68.jpg)
68
Mehrfachvererbung: Abstraktionen kombinieren
COMPARABLE
NUMERIC
STRING COMPLEX
INTEGER
REAL
<, <=, >, >=, …
+, –, *, / …
(Totale Ordnungs-relation)
(kommutativer Ring)
![Page 69: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/69.jpg)
69
Wie schreiben wir COMPARABLE ?
deferred class COMPARABLE feature
end
less alias "<" (x : COMPARABLE): BOOLEANdeferredend
less_equal alias "<=" (x : COMPARABLE): BOOLEAN
doResult := (Current < x or (Current =
x))endgreater alias ">" (x : COMPARABLE): BOOLEANdo Result := (x < Current) end
greater_equal alias ">=" (x : COMPARABLE): BOOLEANdo Result := (x <= Current) end
![Page 70: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/70.jpg)
70
Figuren in einem Graphischen Editor
![Page 71: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/71.jpg)
71
Zusammengesetzte Figuren
![Page 72: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/72.jpg)
72
Mehrfachvererbung: Zusammengesetzte Figuren
Eine zusammengesetzte Figur
Einfache Figuren
![Page 73: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/73.jpg)
73
Den Begriff der zusammengesetzten Figur definieren
COMPOSITE_FIGURE
center
displayhiderotatemove…
countitembeforeafter…putremove…
FIGURELIST
[FIGURE
]
![Page 74: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/74.jpg)
74
In der allgemeinen Struktur
COMPOSITE_
FIGURE
FIGURELIST
[FIGURE
]
OPEN_FIGURE
CLOSED_FIGURE
SEGMENT POLYLINE POLYGON ELLIPSE
RECTANGLE
SQUARE
CIRCLE
TRIANGLE
perimeter+
perimeter*
perimeter++
diagonal
perimeter++
perimeter++
perimeter+
![Page 75: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/75.jpg)
75
(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)
![Page 76: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/76.jpg)
76
(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)
![Page 77: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/77.jpg)
77
Eine zusammengesetzte Figur als Liste
c
c.item
countindex1
![Page 78: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/78.jpg)
78
Zusammengesetzte Figuren
class COMPOSITE_FIGURE inheritFIGURE
LIST [FIGURE]feature
display-- Jede einzelne Figur der
Reihenfolge-- nach anzeigen.
doacross Current as c loop
c.item.display
endend... Ähnlich für move, rotate etc. ...
end
Benötigt dynamisches
Binden
![Page 79: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/79.jpg)
79
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
![Page 80: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/80.jpg)
80
Mehrfachvererbung: Abstraktionen kombinieren
COMPARABLE
NUMERIC
STRING COMPLEX
INTEGER
REAL
<, <=, >, >=, …
+, –, *, / …
(totale Ordnungs-beziehung)
(kommutativer Ring)
![Page 81: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/81.jpg)
81
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
![Page 82: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/82.jpg)
82
Mehrfachvererbung: Abstraktionen kombinieren
COMPARABLE
NUMERIC
STRING COMPLEX
INTEGER
REAL
<, <=, >, >=, …
+, –, *, / …
(totale Ordnungs-beziehung)
(kommutativer Ring)
![Page 83: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/83.jpg)
83
Wie schreiben wir die Klasse COMPARABLE?
deferred class COMPARABLE feature
end
less alias "<" (x : COMPARABLE [G ]): BOOLEAN
deferredendless_equal alias "<=" (x : COMPARABLE [G ]):
BOOLEANdo
Result := (Current < x or (Current ~ x))
endgreater alias ">" (x : COMPARABLE [G ]): BOOLEAN
do Result := (x < Current) endgreater_equal alias ">=" (x : COMPARABLE [G ]): BOOLEAN
do Result := (x <= Current) end
![Page 84: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/84.jpg)
84
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
![Page 85: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/85.jpg)
85
Ein typisches Beispiel aus der Eiffel-Bibliothek
class ARRAYED_LIST [G ] inheritLIST [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
![Page 86: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/86.jpg)
86
Man könnte auch Delegation benutzen…
class ARRAYED_LIST [G ] inheritLIST [G ]
featurerep : ARRAY [G ]… Implementiere LIST –Features mit ARRAY-
Features, auf rep angewendet…
endBeispiel:
i_th (i : INTEGER ): G-- Element mit Index
`i’.do
Result := rep item (i)end
![Page 87: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/87.jpg)
87
Nicht-konforme Vererbung
classARRAYED_LIST [G ]
inheritLIST [G ]
ARRAY [G ]
feature… Implementiere LIST -Features mit ARRAY-
Features …end
inherit {NONE }
ARRAYLIST
ARRAYED_LIST
Nicht-konforme Vererbung
![Page 88: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/88.jpg)
88
Mehrfachvererbung: Namenskonflikte
f
C
f A B
?
![Page 89: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/89.jpg)
89
Namenskonflikte auflösen
f
rename f as A_f C
f A B
A_f, f
class C inheritA rename f as A_f
endB
…
![Page 90: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/90.jpg)
90
Konsequenzen des Umbenennens
a1 : Ab1 : Bc1 : C...
c1.fc1.A_f
a1.fb1.f
rename f as A_f
C
f A B
A_f, f
f
Ungültig: a1.A_f b1.A_f
![Page 91: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/91.jpg)
91
Redefinition und Umbenennen
Redefinition ändert das Feature und behält seinen NamenUmbenennen behält das Feature und ändert seinen Namen
Es ist möglich beide zu kombinieren:
class B inheritA
rename f as A_fredefine A_fend
…
![Page 92: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/92.jpg)
92
Noch eine Anwendung von Umbenennungen
Eine (lokal) bessere Terminologie ermöglichen.Beispiel: child (TREE ); subwindow (WINDOW)
![Page 93: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/93.jpg)
93
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 inheritRECTANGLETREE [WINDOW]
renameparent as superwindow,children as subwindows,add_child as add_subwindow…
endfeature
...end
ABER: Siehe Stilregeln betreffend
einheitlichen Featurenamen
![Page 94: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/94.jpg)
94
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)
![Page 95: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/95.jpg)
95
Features verschmelzen
A B C
D
f +f * f *
* aufgeschoben
+ wirksam
![Page 96: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/96.jpg)
96
Features verschmelzen: Mit verschiedenen Namen
A B C
D
h +g * f *
*
aufgeschoben+ wirksam Umbenennung
g f h f
classD
inheritA
rename
g as f
end
B
C
rename
h as f
end
feature...
end
![Page 97: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/97.jpg)
97
Features verschmelzen: wirksame Features
A B C
D
f +
f + f +
* aufgeschoben
+ wirksam-- undefiniert
f --f --
![Page 98: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/98.jpg)
98
Undefinition
deferred classT
inheritS
undefine f end
feature
...
end
![Page 99: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/99.jpg)
99
Verschmelzen durch Undefinition
classD
inheritA
undefine f end
B
undefine f end
C
feature...
end
A B C
D
f +
f + f +
f --f --
* aufgeschoben
+ wirksam-- undefiniert
![Page 100: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/100.jpg)
100
Verschmelzen von Features mit unterschiedlichen Namen
A B C
D
h +
f + g +
f --
f --
classD
inheritA
undefine f
end
Brename
g as f undefine
f end
Crename
h as f end
feature ... end
h f
g f
![Page 101: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/101.jpg)
101
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
![Page 102: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/102.jpg)
102
Verschmelzung von Features: wirksame Features
a1: A b1: B c1: C d1: Da1.g b1.f c1.h d1.f
A B C
D
g+
f+ h+
g f h ff- f-
![Page 103: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/103.jpg)
103
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)
????
????
![Page 104: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/104.jpg)
104
Indirekt und direkt wiederholte Vererbung
A
D
B C
A
D
Auch als «Diamant des Todes» bekannt
![Page 105: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/105.jpg)
105
Mehrfachvererbung ist auch wiederholte Vererbung
Ein typischer Fall:
copy ++
is_equal ++
copy
is_equal
??
copy C_copyis_equal C_is_equal
CLIST
D
ANY
![Page 106: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/106.jpg)
106
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
![Page 107: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/107.jpg)
107
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
fg
g g_b
g g_c
![Page 108: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/108.jpg)
108
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.
![Page 109: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/109.jpg)
109
Der Bedarf nach „select“
Eine mögliche Doppeldeutigkeit entsteht durch Polymorphie und dynamisches Binden:
a1 : ANYd1 : D
…
a1 := d1
a1.copy (…)
copy ++
is_equal ++
copy C_copyis_equal C_is_equal
CLIST
D
copy
is_equal ANY
![Page 110: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/110.jpg)
110
Die Doppeldeutigkeit auflösen
classD
inheritLIST [T ]
selectcopy, is_equal
end
Crename
copy as C_copy, is_equal as C_is_equal,
...end
![Page 111: Chair of Software Engineering Einführung in die Programmierung Prof. Dr. Bertrand Meyer Lektion 18: Mehr über Vererbung und Agenten](https://reader038.vdocuments.site/reader038/viewer/2022110117/55204d8349795902118d72f4/html5/thumbnails/111.jpg)
111
Was wir gesehen haben
Einige Spielchen, die man mit Vererbung spielen kann:
Mehrfachvererbung Verschmelzen von Features Wiederholte Vererbung