close

Anmelden

Neues Passwort anfordern?

Anmeldung mit OpenID

Introduction to Programming Lecture 17: Vererbung Was ist

EinbettenHerunterladen
1
2
Introduction to Programming
Lecture 17:
Vererbung
Bertrand Meyer
Last revised 15 December 2003
Chair of Software Engineering
Chair of Software Engineering
Introduction to Programming – Lecture 17
Was ist Vererbung?
ƒ Parent, Erbe
Chair of Software Engineering
*
FIGURE
*
OPEN_
FIGURE
perimeter*
*
+
POLYGON
POLYLINE
diagonal
perimeter++
...
TRIANGLE
RECTANGLE
+ effective
class POLYGON
++ redefined
create
make
feature
+
ELLIPSE
SQUARE
vertices: ARRAY [POINT]
perimeter+
vertices_count: INTEGER
perimeter: REAL is
...
do
vertices @ i
side1
side2
vertices @ (i + 1)
CIRCLE
perimeter++
6
deferred
*
CLOSED_
FIGURE
perimeter+
SEGMENT
Introduction to Programming – Lecture 17
Redefinition 1: Polygone
5
display*
rotate
…
B
ƒ (Andere Terminologie: Subklasse, Superklasse,
Basis Klasse)
Introduction to Programming – Lecture 17
extent*
center*
…
feature
A
ƒ Direkte Instanz, Instanz
ƒ Die Instanzen von A sind die
direkten Instanzen seiner Nachkommen.
ƒ Aus der Typ Sichtweise: Vererbung ist die ‘‘is-plus-butexcept’’ Beziehung. Wenn B von A erbt, ist immer wenn
eine Instanz von A benötigt wird auch eine Instanz von B
akzeptabel.
Beispiel Hierarchie
4
feature
ƒ Vorfahre, Nachkomme
ƒ Die Vorfahren von B sind B selbst
und die Vorfahren seiner Eltern.
ƒ direkter Vorfahre, direkter Nackomme
ƒ Aus der Modul Sichtweise: wenn B von A erbt, werden alle
Services von A potentiell in B erhältlich (möglicherweise
mit anderen Implementierungen).
Chair of Software Engineering
Terminologie
3
ƒ Prinzip: Beschreibe eine neue Klasse nicht von Grund auf ,
sondern als Erweiterung oder Spezialisierung einer bereits
existierenden Klasse. Im Fall von Mehrfachvererbung als
Erweiterung oder Spezialisierung mehrerer bereits
existierender Klassen.
Introduction to Programming – Lecture 17
perimeter++
end
-- Perimeter length
from ... until ... loop
Result := Result +
(vertices @ i) . distance (vertices @ (i + 1))
...
end
invariant
vertices_count >= 3
vertices_count = vertices.count
end
Chair of Software Engineering
Introduction to Programming – Lecture 17
Chair of Software Engineering
Introduction to Programming – Lecture 17
1
Redefinition 2: Rechtecke
7
class RECTANGLE inherit
POLYGON
redefine
perimeter
end
create
side1
feature
diagonal, side1, side2: REAL
perimeter: REAL is
-- Perimeter length
do
Result := 2 * (side1 + side2)
end
(RECTANGLE)
ƒ NICHT erlaubt ist:
x := p.diagonal (even just after p := r !)
r := p
invariant
vertices_count = 4
end
Chair of Software Engineering
Chair of Software Engineering
Introduction to Programming – Lecture 17
Dynamic binding
9
ƒ Was ist der Effekt des folgenden Codes (unter Annahme
some_test ist true)?
ƒ Redefinition: Eine Klasse kann ein vererbtes Feature
verändern, so wie bei RECTANGLE perimeter (Umfang) von
POLYGON redefiniert wird.
ƒ Polymorphismus: p kann zur Laufzeit verschiedene Formen
haben.
Chair of Software Engineering
Introduction to Programming – Lecture 17
11
10
Introduction to Programming – Lecture 17
Genericity + Vererbung 1: Polymorphe Daten
Strukturen
class STACK [G]
f: FIGURE
c: CIRCLE
p: POLYGON
...
create c.make (...)
create p.make (...)
...
if ... then
f := c
else
f := p
end
...
f.move (...)
f.rotate (...)
f.display (...)
...
Chair of Software Engineering
Nicht-O-O Techniken
und auf die gleiche Weise für alle anderen
Routinen!
ƒ Dynamic binding: Effekt von p.perimeter hängt von der
Laufzeit Form von p ab.
Mit Vererbung
Introduction to Programming – Lecture 17
display (f: FIGURE) is
do
if ‘‘f is a CIRCLE’’ then
...
elseif ‘‘f is a POLYGON’’ then
...
end
end
if some_test then
p := r
else
p := t
end
x := p.perimeter
Chair of Software Engineering
8
ƒ Voraussetzung:
p: POLYGON; r: RECTANGLE; t: TRIANGLE;
x: REAL
p
ƒ Erlaubt ist:
(POLYGON)
x := p.perimeter
x := r.perimeter
r
x := r.diagonal
p := r
side2
make
Vererbung, Typing und Polymorphismus
fs
feature
...
item: G is ...
put (x: G) is ...
end
(RECTANGLE)
(SQUARE)
fs: STACK [FIGURE]
r: RECTANGLE
s: SQUARE
t: TRIANGLE
p: POLYGON
...
fs.put (p); fs.put (t); fs.put (s); fs.put (r)
fs.item.display
Introduction to Programming – Lecture 17
Chair of Software Engineering
12
(TRIANGLE)
(POLYGON)
Introduction to Programming – Lecture 17
2
Beispiel Hierarchie
extent*
barycenter*
…
*
FIGURE
*
deferred
14
Abstraktion
+ effective
++ redefined
*
OPEN_
FIGURE
perimeter*
+
POLYGON
POLYLINE
diagonal
perimeter++
...
TRIANGLE
SET_OF_
BOOKS
*
CLOSED_
FIGURE
perimeter+
SEGMENT
Genericity gegenüber Vererbung
13
display*
rotate
…
RECTANGLE
+
ELLIPSE
perimeter+
Typ Parametrisierung
LIST_OF_
PEOPLE
...
LIST_OF_
JOURNALS
side1
side2
CIRCLE
perimeter++
Typ Parametrisierung
LIST_OF_
BOOKS
SQUARE
LIKED_LIST_
OF_BOOKS
perimeter++
Spezialisierung
Chair of Software Engineering
Chair of Software Engineering
Introduction to Programming – Lecture 17
Einen Typ erzwingen: Das Problem
Aber:
ƒ Wenn x als RECTANGLE deklariert wurde, ist [1]
ungültig.
ƒ Wenn x als FIGURE deklariert wurde, ist [2]
ungültig.
f: FIGURE
r: RECTANGLE
...
fs.retrieve ("FILE_NAME")
f := fs.item
r ?= f
if r /= Void then
print (r.diagonal)
else
print ("Too bad.")
end
Chair of Software Engineering
Chair of Software Engineering
Introduction to Programming – Lecture 17
Zuweisungs-Versuch
Introduction to Programming – Lecture 17
16
fs.store ("FILE_NAME")
...
-- Zwei Jahre später:
fs ?= retrieved ("FILE_NAME")
x := fs.item
-- [1]
print (x.diagonal) -- [2]
Aber:
ƒ Wenn x als RECTANGLE deklariert wurde, ist [1]
ungültig.
ƒ Wenn x als FIGURE deklariert wurde, ist [2]
ungültig.
Chair of Software Engineering
Die Lösung: Zuweisungs-Versuch
15
fs.store ("FILE_NAME")
...
-- Zwei Jahre später:
fs := retrieved ("FILE_NAME")
x := fs.item
-- [1]
print (x.diagonal) -- [2]
Introduction to Programming – Lecture 17
Introduction to Programming – Lecture 17
Zuweisungs-Versuch
17
18
x ?= y
mit
x: A
ƒ Wenn y ein Objekt ist, dessen Typ A entspricht,
wird die Zuweisung normal ausgeführt.
ƒ Andernfalls wird x Void.
Chair of Software Engineering
Introduction to Programming – Lecture 17
3
Genericity + Vererbung 2: Eingeschränkte Genericity
19
class VECTOR [G]
Eingeschränkte Genericity
20
ƒ Der body von infix "+":
feature
create Result.make (lower, upper)
from
i := lower
until
i > upper
loop
a := item (i)
b := other.item (i)
c := a + b
-- Benötigt eine infix “+” Operation in G!
Result.put (c, i)
i := i + 1
end
infix "+" (other: VECTOR [G]): VECTOR [G] is
-- Sum of current vector and other
require
lower = other.lower
upper = other.upper
local
a, b, c: G
do
... See next ...
end
... Other features ...
end
Chair of Software Engineering
Chair of Software Engineering
Introduction to Programming – Lecture 17
Eingeschränkte Genericity
21
22
class VECTOR [G –> NUMERIC]
create Result.make (lower, upper)
from
i := lower
until
i > upper
loop
a := item (i)
b := other.item (i)
-- Benötigt eine infix “+” Operation in G!
c := a + b
Result.put (c, i)
i := i + 1
end
feature
... Der Rest wie oben ...
end
ƒ Klasse NUMERIC (aus der Kernel Bibliothek) stellt
die Features infix "+", infix "*" und so weiter zur
Verfügung.
ƒ Noch besser: mache VECTOR selbst zum
Nachkommen von NUMERIC
Chair of Software Engineering
Introduction to Programming – Lecture 17
Verbesserte Lösung
Die Lösung
ƒ Deklariere Klasse VECTOR als
ƒ Der body von infix "+":
Chair of Software Engineering
Introduction to Programming – Lecture 17
23
Introduction to Programming – Lecture 17
Vererbung und Assertions
ƒ mache VECTOR selbst zum Nachkommen von NUMERIC
class VECTOR [G –> NUMERIC]
inherit
C
A
a1: A
…
a1.r (…)
24
r is
require
α
ensure
β
NUMERIC
Korrekter Call:
feature
... Der Rest wie vorher, inklusive infix "+"...
end
ƒ So wird es möglich zu definieren
v: VECTOR [VECTOR [VECTOR [INTEGER]]]
Chair of Software Engineering
Introduction to Programming – Lecture 17
B
if a1.α then
a1.r (...)
else
...
end
Chair of Software Engineering
r is
require
γ
ensure
δ
Introduction to Programming – Lecture 17
4
Assertion Redeklarations Regel
ƒ Die Redefinierte Version kann kein require oder
ensure haben.
ƒ Die Redefinierte Version kann weder ein require
noch ein ensure haben. (Assertions werden
beibehalten), oder
25
Invarianten Akkumulation
26
ƒ Jede Klasse erbt alle Invarianten ihrer Eltern.
ƒ Diese werden konzeptuell ver-“and”-et.
require else new_pre
ensure then new_post
ƒ Resultierende Assertions sind:
ƒ original_precondition or new_pre
ƒ original_postcondition and new_post
Chair of Software Engineering
Introduction to Programming – Lecture 17
Chair of Software Engineering
Introduction to Programming – Lecture 17
5
Document
Kategorie
Technik
Seitenansichten
12
Dateigröße
544 KB
Tags
1/--Seiten
melden