Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

Post on 05-Apr-2015

108 views 1 download

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.

...