Grundkonzepte OOP PS 1 Teil 1 Helmut Paulus MPG Trier Speyer, 14.04.08 Grundkonzepte der OOP.
Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.
-
Upload
hulderich-schickler -
Category
Documents
-
view
108 -
download
1
Transcript of Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.
Grundkonzepte der objektorientierten Programmierung
Teil 3
Klaus Becker
2006
2 Objektorientierte Modellierung
1$ 1$ 1$ 1$1$ 1$ 1$
1$ 1$1
2
3
4
5
631$31$
Miniwelt
Modell
System
3 Teil 1
Vererbung
4 Zielsetzung
1$ 1$ 1$ 1$1$ 1$ 1$
1$ 1$1
2
3
4
5
631$31$
Beim Würfelspiel „chuck a luck“ soll einer der Würfel durch ein Glücksrad ersetzt werden. Ziel ist es, die sich hierdurch ergebenden Änderungen im Modell zu untersuchen.
61
4
3
25
5 Modellierung
Miniwelt
Eine strukturgetreue, an der Miniwelt orientierte Modellierung zeigt neben zwei Würfel-Objekten auch ein Glücksrad-Objekt.
wuerfelA wuerfelB rad
TWuerfel
augen
werfen
instance of
augen = 3 augen = 3 position = 5
TGluecksrad
position
drehen
instance of
61
4
3
25
Modell
6
Implementierung mit Code-Duplizierung
unit uWuerfel;
interface
type TWuerfel = ..
implementation
constructor TWuerfel.create;begin augen := random(6)+1;end;
procedure TWuerfel.werfen;begin augen := random(6)+1;end;
function TWuerfel.getAugen: ..begin result := augen;end;
end.
TWuerfel
– augen: integer
+ create+ werfen+ getAugen: integer
unit uGluecksrad;
interface
type TGluecksrad = ..
implementation
constructor TGluecksrad.create;begin position := random(6)+1;end;
procedure TGluecksrad.drehen;begin position := random(6)+1;end;
function TGluecksrad.getPosit.. begin result := position;end;
end.
TGluecksrad
– position: integer
+ create+ drehen+ getPosition: integer
7
Universelle Klasse zur Vermeidung ...
TZufallsgeraet
– wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
Zur Vermeidung unnötiger Code-Duplizierung kann man eine universelle Klasse „TZufallsgeraet“ einführen, mit deren Hilfe Objekte erzeugt werden können, die mit Hilfe der Methode „aktivieren“ eine Zufallszahl aus dem Bereich 1..6 erzeugen können.
wuerfelA wuerfelB rad
wert = 3 wert = 3 wert = 5
instance of
// Erzeugung der Objekte
wuerfelA := TZufallsgeraet.create;wuerfelB := TZufallsgeraet.create;rad := TZufallsgeraet.create;
// Aktivierung der Objekte
wuerfelA.aktivieren;wuerfelB.aktivieren; rad.aktivieren;
8 ... von Code-Duplizierung
Vorteil: Man benötigt nur eine Klasse zur Erzeugung der gewünschten Objekte.Nachteil: Unterschiede zwischen Würfel-Objekten und Glücksrad-Objekten können nicht erfasst werden.
wuerfelA wuerfelB rad
wert = 3 wert = 3 wert = 5
instance of
TZufallsgeraet
– wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
9 Kleine Unterschiede
Zur Verdeutlichung „kleiner Unterschiede“ soll das Chuck-A-Luck-Spiel jetzt mit einem universellen Zufallsgerät, einem Würfel und einem Glücksrad durchgeführt werden. Dabei gehen wir von folgenden Annahmen aus: Ein TZufallsgeraet-Objekt soll nach der Erzeugung einen unbestimmten (vom Compiler beliebig festgelegten) Wert haben.Ein TWuerfel-Objekt soll ein spezielles TZufallsgeraet-Objekt sein, das nach der Erzeugung eine nicht vorhersagbare Augenzahl aus dem Bereich 1..6 hat.Ein TGluecksrad-Objekt soll ein spezielles TZufallsgeraet-Objekt sein, das nach der Erzeugung immer auf Position 1 eingestellt ist. Zudem soll ein solches Objekt über eine Methode „stoppen“ verfügen, mit deren Hilfe die Anfangsposition eingestellt werden kann.
3 61
4
3
25
10 Kleine Unterschiede
TZufallsgeraet
– wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
TWuerfel
+ create
TGluecksrad
+ create+ stoppen
61
4
3
253
geraet wuerfel rad
wert = 3 wert = 3 wert = 5
instance of
ist ist
instance of instance of
Die Klasse TWuerfel bzw. die Klasse TGluecksrad ist hier eine Erweiterung der Klasse TZufallsgeraet.
11 Vererbung
TZufallsgeraet
– wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
TWuerfel
+ create
TGluecksrad
+ create+ stoppen
geraet wuerfel rad
wert = 3 wert = 3 wert = 5
instance of
ist ist
instance of instance of
Eine Erweiterung einer „Superklasse“ erbt alle Attribute und Methoden dieser Klasse. Eine solche „Subklasse“ kann weitere Attribute und Methoden besitzen. Sie kann auch ererbte Methoden überschreiben (d. h. neu festlegen).
Vererbung ermöglicht es, eine Klasse als Erweiterung einer anderen Klasse zu konzipieren.
Superklasse
Subklasse
12 Implementierung der Superklasse
TZufallsgeraet
– wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
TWuerfel
+ create
TGluecksrad
+ create+ stoppen
geraet wuerfel rad
wert = 3 wert = 3 wert = 5
instance of
ist ist
instance of instance of
unit uZufallsgeraet;
interface
type TZufallsgeraet = ..
implementation
constructor TZufallsgeraet.cre..beginend;
procedure TZufallsgeraet.aktiv..begin augen := random(6)+1;end;
function TZufallsgeraet.getWer..begin result := wert;end;
...
end.
Keine Initialisierung
13 Implementierung einer Subklasse
TZufallsgeraet
– wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
TWuerfel
+ create
TGluecksrad
+ create+ stoppen
geraet wuerfel rad
wert = 3 wert = 3 wert = 5
instance of
ist ist
instance of instance of
unit uWuerfel;
interface
uses uZufallsgeraet;
type TWuerfel = class(TZufallsgeraet) public constructor create; end;
implementation
constructor TWuerfel.create;begin inherited create; aktivieren;end;
end.
14 Implementierung einer Subklasse
TZufallsgeraet
– wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
TWuerfel
+ create
TGluecksrad
+ create+ stoppen
geraet wuerfel rad
wert = 3 wert = 3 wert = 5
instance of
ist ist
instance of instance of
unit uGluecksrad;
interface
uses uZufallsgeraet;
type TGluecksrad = class(TZufallsgeraet) public constructor create; procedure stoppen; end;
implementation
constructor TGluecksrad.create;begin inherited create; setWert(1);end;
procedure TGluecksrad.stoppen;begin setWert(1);end; ...
15 Vererbung und Zugriffsrechte
type TGluecksrad = class(TZufallsgeraet) public constructor create; procedure stoppen; end;
implementation
constructor TGluecksrad.create;begin inherited create; wert := 1;end;
Die privaten Attribute der Superklasse sind in den Subklassen nicht zugreifbar.
TZufallsgeraet
– wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
TWuerfel
+ create
TGluecksrad
+ create+ stoppen
ist ist
type TZufallsgeraet = class private wert: integer; public ...
Fehler
16 Vererbung und Zugriffsrechte
type TGluecksrad = class(TZufallsgeraet) public constructor create; procedure stoppen; end;
implementation
constructor TGluecksrad.create;begin inherited create; wert := 1;end;
Die Attribute der Superklasse sind hier auch in den Subklassen zugreifbar.
TZufallsgeraet
# wert: integer
+ create+ aktivieren+ getWert: integer+ setWert(w: integer)
TWuerfel
+ create
TGluecksrad
+ create+ stoppen
ist ist
type TZufallsgeraet = class protected wert: integer; public ...
Ok!
17
Erzeugung von Subklassen-Objekten
unit uGluecksrad;
interface
uses uZufallsgeraet;
type TGluecksrad = class(TZufallsgeraet) public constructor create; procedure stoppen; end;
implementation
constructor TGluecksrad.create;begin inherited create; setWert(1);end;
procedure TGluecksrad.stoppen;begin setWert(1);end; ...
Im Konstruktor einer Subklasse muss zunächst der Konstruktor der Superklasse aufgerufen werden.
18
Erzeugung von Subklassen-Objekten
unit uGluecksrad;
interface
uses uZufallsgeraet;
type TGluecksrad = class(TZufallsgeraet) public constructor create; procedure stoppen; end;
implementation
constructor TGluecksrad.create;begin setWert(1);end;
procedure TGluecksrad.stoppen;begin setWert(1);end; ...
Fehlt dieser Aufruf, so wird er automatisch vom Compiler ergänzt.
inherited create;
19 Aufgabe
Erstellen Sie ein Chuck-A-Luck-System wie beschrieben. Die Klasse TZufallsgeraet kann weiter verallgemeinert werden. Z. B. könnte der Bereich der möglichen Zufallszahlen erweitert werden. Führen Sie die erforderlichen Veränderungen durch.
20 Aufgabe
Testen Sie die gezeigte Implementierung der Klasse TWuerfel (z. B. in einer Version ChuckALuck2..) und erklären Sie die markierten Zusätze. Informieren Sie sich hierzu auch über die in Delphi vordefinierte Klasse TObject.
unit uWuerfel;
interface
type TWuerfel = class(TObject) private augen: integer; public constructor create; procedure werfen; function getAugen: integer; end;
implementation
constructor TWuerfel.create;begin inherited create; augen := random(6)+1;end;
...
21 Teil 2
Polymorphie
22 Zielsetzung
1$ 1$ 1$ 1$1$ 1$ 1$
1$ 1$1
2
3
4
5
631$31$
Das Würfelspiel „chuck a luck“ soll – ohne dass der Benutzer es weiß – mal mit idealen, mal mit gezinkten Würfeln gespielt werden.
23 Modellierung
Bei einem gezinkten Würfel sollen die Augenzahlen 1..6 mit ungleicher Wahrscheinlichkeit auftreten (z. B. 1: 50%, 2: 10%, 3: 10%, ...).
wuerfelA wuerfelB wuerfelC
augen = 3 augen = 3 augen = 5
TIdealerWuerfel
augen
werfen
instance of
wuerfelA wuerfelB wuerfelC
augen = 1 augen = 1 augen = 1
TGezinkterWuerfel
augen
werfen
instance of
24 Modellierung
Ideale und gezinkte Würfel werden als Spezialisierung eines „allgemeinen“ Würfels konzipiert, der beim Werfen nichts machen soll.
TIdealerWuerfel
werfen // Augen von 1..6
TGezinkterWuerfel
werfen // Augen von 1..6
TWuerfel
- augen: integer
+ create+ werfen // nichts machen + getAugen: integer+ setAugen(a: integer)
ist ist
25 Implementierungsversuch
TIdealerWuerfel TGezinkterWuerfel
ist ist
unit uWuerfel;
interface
type TWuerfel = class private augen: integer; public constructor create; procedure werfen; function getAugen: integer; procedure setAugen(a: int.. end;
implementation
constructor TWuerfel.create;begin augen := 1;end;
procedure TWuerfel.werfen;beginend; ...
TWuerfel
- augen: integer
+ create+ werfen // nichts machen + getAugen: integer+ setAugen(a: integer)
werfen // Augen von 1..6 werfen // Augen von 1..6
26 Implementierungsversuch
TIdealerWuerfel TGezinkterWuerfel
ist ist
unit uGezinkterWuerfel;
interface
uses uWuerfel;
type
TGezinkterWuerfel = class(TWuerfel) public procedure werfen; end;
implementation
procedure TGezinkterWuerfel.werfen; var hilf: real;begin hilf := random; if hilf < 0.5 then setAugen(1) else if hilf < 0.6 then setAugen(2) else if hilf < 0.7 then ...
TWuerfel
- augen: integer
+ create+ werfen // nichts machen + getAugen: integer+ setAugen(a: integer)
werfen // Augen von 1..6 werfen // Augen von 1..5
Die Klasse „TIdealerWuerfel“ wird analog implementiert.
27 Implementierungsversuch
...
type TSpielmanager = class private zustand: integer; wuerfelA: TWuerfel; wuerfelB: TWuerfel; wuerfelC: TWuerfel; konto: TKonto; spielbrett: TSpielbre.. public constructor create; procedure wuerfelWerfen ...
type TGUI = class(TForm) ... private { Private-Deklarationen } wuerfelA, wuerfelB, ...: TWuerfel; ...
procedure TGUI.FormCreate(Sender: TOb.. var hilf: integer;begin {Wahl der Würfel}randomize; hilf := random(2);if hilf = 0 then {erzeuge ideale Würf.}begin wuerfelA := TIdealerWuerfel.create; wuerfelB := TIdealerWuerfel.create; wuerfelC := TIdealerWuerfel.create;endelse {erzeuge gezinkte Würfel}begin wuerfelA := TGezinkterWuerfel.create; wuerfelB := TGezinkterWuerfel.create; wuerfelC := TGezinkterWuerfel.create;...
procedure ...wuerfelWerfen;begin wuerfelA.werfen; wuerfelB.werfen; wuerfelC.werfen;end;
28 Statischer / dynamischer Typ
Statischer Typ: TWuerfel
Dynam. Typ: TIdealerWuerfe
l
Deklaration: statischer Typ Laufzeit: dynamischer Typ
type TGUI = class(TForm) ... private { Private-Deklarationen } wuerfelA, wuerfelB, ...: TWuerfel; ...
procedure TGUI.FormCreate(Sender: TOb.. var hilf: integer;begin {Wahl der Würfel}randomize; hilf := random(2);if hilf = 0 then {erzeuge ideale Würf.}begin wuerfelA := TIdealerWuerfel.create; wuerfelB := TIdealerWuerfel.create; wuerfelC := TIdealerWuerfel.create;endelse {erzeuge gezinkte Würfel}begin wuerfelA := TGezinkterWuerfel.create; wuerfelB := TGezinkterWuerfel.create; wuerfelC := TGezinkterWuerfel.create;...
procedure ...wuerfelWerfen;begin wuerfelA.werfen; wuerfelB.werfen; wuerfelC.werfen;end;
29 Frühe Bindung / späte Bindung
Statischer Typ: TWuerfel
Dynam. Typ: TIdealerWuerfe
l
procedure ...wuerfelWerfen;begin wuerfelA.werfen; ...end;
Bei früher Bin-dung ist der sta-tische Typ für die Ausführung einer Methode aus-schlaggebend.
Statischer Typ: TWuerfel
Dynam. Typ: TIdealerWuerfe
l
procedure ...wuerfelWerfen;begin wuerfelA.werfen; ...end;
Bei später Bindung wird die Suche der Methode beim dynamischen Typ begonnen.
30
Implementierung von später Bindung
Statischer Typ: TWuerfel
Dynam. Typ: TIdealerWuerfe
l
type TWuerfel = class private augen: integer; public constructor create; procedure werfen; virtual; ... end;
implementation
procedure TWuerfel.werfen;begin end; ...
type TIdealerWuerfel = class(TWuerfel) public procedure werfen; override; end;
implementation
procedure TIdealerWuerfel.werfen;begin setAugen(random(6)+1); end; ...
procedure ...wuerfelWerfen;begin wuerfelA.werfen; ...end;
31
Implementierung von früher Bindung
Statischer Typ: TWuerfel
Dynam. Typ: TIdealerWuerfe
l
type TWuerfel = class private augen: integer; public constructor create; procedure werfen; ... end;
implementation
procedure TWuerfel.werfen;begin end; ...
type TIdealerWuerfel = class(TWuerfel) public procedure werfen; end;
implementation
procedure TIdealerWuerfel.werfen;begin setAugen(random(6)+1); end; ...
procedure ...wuerfelWerfen;begin wuerfelA.werfen; ...end;
32 Abstrakte Methoden
type TWuerfel = class private augen: integer; public constructor create; procedure werfen; virtual; abstract; ... end;
implementation
// keine Implementierung von werfen
type TIdealerWuerfel = class(TWuerfel) public procedure werfen; override; end;
implementation
procedure TIdealerWuerfel.werfen;begin setAugen(random(6)+1); end; ...
Abstrakte Methoden werden in der Superklasse nur deklariert und erst in Subklassen implementiert.
33 Polymorphie
später
zunächst
Methodenaufrufe können polymorph gestaltet werden. Derselbe Methodenaufruf kann zur Laufzeit zu verschiedenen Zeitpunkten verschiedene Methoden aufrufen, abhängig vom jeweiligen dynamischen Typ der für den Aufruf verantwortlichen Variablen.
34 Aufgabe
Erstellen Sie ein Chuck-A-Luck-System wie beschrieben. Fügen Sie einen Button hinzu, um das Chuck-A-Luck-Spiel neu zu initialisieren. Dabei soll auch neu festgelegt werden, mit welchen Würfeln (ideal, gezinkt) gespielt wird.
35 Aufgabe
Erklären Sie die markierte Stelle. Informieren Sie sich hierzu auch über die in Delphi vordefinierte Klasse TObject.
unit uWuerfel;
interface
type TWuerfel = class(TObject) private augen: integer; public constructor create; destructor destroy; override; procedure werfen; function getAugen: integer; end;
...
36 Teil 3
Zusammenfassung
37 Objektorientierung
GrundideenO
bje
kt
Nach
rich
t
Bezi
eh
un
g
Kla
sse
Modellierungssprache: UML
Implementierungssprache: Delphi, Java, ...
Poly
morp
hi
e
Vere
rbu
ng
Grund-konzepte
38 Idee: Objekt als Baustein
Objekte / Klassen sollten nach Möglichkeit so abstrakt entworfen werden, dass sie zur
Erledigung vieler Aufgaben benutzt werden können (Wiederverwendung). Gut
verwendbare Klassen können dann in Klassenbibliotheken zur weiteren Verwendung
bereitgestellt werden.
39 Literaturhinweise
Es gibt eine Vielzahl von fachwissenschaftlichen Darstellungen zur objektorientierten Modellierung und Programmierung. Hier wurden folgende Lehrwerke benutzt:- D. J. Barnes, M. Kölling: Objektorientierte Programmierung mit Java. Pearson - Studium 2003.- Helmut Balzert: Lehrbuch Grundlagen der Informatik. Spektrum Ak. Verlag 1999.- Bernd Oestereich: Objektorientierte Softwareentwicklung. Oldenbourg 1998.
Dagegen gibt es nur wenige Schulbücher, die systematisch in die objektorientierte Programmierung einführen, z. B.: - Siegfried Spolwig: Objektorientierung im Informatikunterricht. Dümmler-Verlag 1997.- P. Damann, J. Wemßen: Objektorientierte Programmierung mit Delphi, Band 2. Klett-Verlag 2003.
Viele interessante Artikel mit Unterrichtsvorschlägen bzw. fachdidaktischen Auseinandersetzungen findet man in der Zeitschrift LOG IN. Das Themenheft 128/129 ist speziell dem Thema „Objektorientiertes Modellieren und Programmieren“ gewidmet.
...
40 Literaturhinweise
Im Internet findet man ebenfalls sehr viele schulgerechte Darstellungen der objektorientierten Modellierung und Programmierung, z. B:
http://informatikag.bildung-rp.de/ Die AG-Informatik des LMZ in RLP stellt u. a. auch Fortbildungsmaterialien zu diesem Thema bereit.
http://hsg.region-kaiserslautern.de/faecher/inf/index.php Auf der Homepage des HSG in Kaiserslautern findet man Unterrichtsmaterialien und Links zu weiteren interessanten Seiten.
...