Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

40
Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006

Transcript of Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

Page 1: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

Grundkonzepte der objektorientierten Programmierung

Teil 3

Klaus Becker

2006

Page 2: 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

Page 3: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

3 Teil 1

Vererbung

Page 4: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 5: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 6: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 7: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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;

Page 8: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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)

Page 9: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 10: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 11: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 12: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 13: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 14: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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; ...

Page 15: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 16: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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!

Page 17: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 18: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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;

Page 19: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 20: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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;

...

Page 21: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

21 Teil 2

Polymorphie

Page 22: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 23: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 24: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 25: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 26: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 27: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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;

Page 28: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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;

Page 29: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 30: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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;

Page 31: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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;

Page 32: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 33: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 34: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 35: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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;

...

Page 36: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

36 Teil 3

Zusammenfassung

Page 37: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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

Page 38: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

Page 39: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

...

Page 40: Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

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.

...