Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Grundkonzepte der objektorientierten Programmierung Teil 3

Ähnliche Präsentationen


Präsentation zum Thema: "Grundkonzepte der objektorientierten Programmierung Teil 3"—  Präsentation transkript:

1 Grundkonzepte der objektorientierten Programmierung Teil 3
Klaus Becker 2006

2 Objektorientierte Modellierung
1 4 1$ 1$ 2 5 1$ 1$ 1$ 1$ 1$ 3 1$ 1$ 1$ 1$ 3 3 6 Miniwelt Modell System

3 Teil 1 Vererbung

4 Zielsetzung 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$
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. 1 4 1$ 1$ 2 5 1$ 1$ 1$ 2 4 1$ 1$ 3 1$ 1$ 1$ 1$ 3 3 6 5 1 3 6

5 Modellierung Eine strukturgetreue, an der Miniwelt orientierte Modellierung zeigt neben zwei Würfel-Objekten auch ein Glücksrad-Objekt. Miniwelt Modell TWuerfel TGluecksrad augen position werfen drehen instance of instance of 2 4 wuerfelA wuerfelB rad 5 1 3 6 augen = 3 augen = 3 position = 5

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. 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. TWuerfel – augen: integer + create + werfen + getAugen: integer TGluecksrad – position: integer + create + drehen + getPosition: integer

7 Universelle Klasse zur Vermeidung ...
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. TZufallsgeraet // Erzeugung der Objekte wuerfelA := TZufallsgeraet.create; wuerfelB := TZufallsgeraet.create; rad := TZufallsgeraet.create; – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) // Aktivierung der Objekte wuerfelA.aktivieren; wuerfelB.aktivieren; rad.aktivieren; instance of wuerfelA wuerfelB rad wert = 3 wert = 3 wert = 5

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. TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) instance of wuerfelA wuerfelB rad wert = 3 wert = 3 wert = 5

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. 2 4 3 5 1 3 6

10 Kleine Unterschiede Die Klasse TWuerfel bzw. die Klasse TGluecksrad ist hier eine Erweiterung der Klasse TZufallsgeraet. TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) ist ist TWuerfel TGluecksrad + create + create + stoppen instance of instance of instance of 2 4 geraet wuerfel rad 3 5 1 3 6 wert = 3 wert = 3 wert = 5

11 Vererbung 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). Superklasse TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) ist ist Subklasse TWuerfel TGluecksrad + create + create + stoppen instance of instance of instance of Vererbung ermöglicht es, eine Klasse als Erweiterung einer anderen Klasse zu konzipieren. geraet wuerfel rad wert = 3 wert = 3 wert = 5

12 Implementierung der Superklasse
unit uZufallsgeraet; interface type TZufallsgeraet = .. implementation constructor TZufallsgeraet.cre.. begin end; procedure TZufallsgeraet.aktiv.. begin augen := random(6)+1; end; function TZufallsgeraet.getWer.. begin result := wert; end; ... end. TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) ist ist Keine Initialisierung TWuerfel TGluecksrad + create + create + stoppen instance of instance of instance of geraet wuerfel rad wert = 3 wert = 3 wert = 5

13 Implementierung einer Subklasse
unit uWuerfel; interface uses uZufallsgeraet; type TWuerfel = class(TZufallsgeraet) public constructor create; end; implementation constructor TWuerfel.create; begin inherited create; aktivieren; end; end. TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) ist ist TWuerfel TGluecksrad + create + create + stoppen instance of instance of instance of geraet wuerfel rad wert = 3 wert = 3 wert = 5

14 Implementierung einer Subklasse
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; ... TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) ist ist TWuerfel TGluecksrad + create + create + stoppen instance of instance of instance of geraet wuerfel rad wert = 3 wert = 3 wert = 5

15 Vererbung und Zugriffsrechte
type TZufallsgeraet = class private wert: integer; public TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) type TGluecksrad = class(TZufallsgeraet) public constructor create; procedure stoppen; end; implementation constructor TGluecksrad.create; begin inherited create; wert := 1; end; ist ist TWuerfel TGluecksrad + create + create + stoppen Die privaten Attribute der Superklasse sind in den Subklassen nicht zugreifbar. Fehler

16 Vererbung und Zugriffsrechte
type TZufallsgeraet = class protected wert: integer; public TZufallsgeraet # wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) type TGluecksrad = class(TZufallsgeraet) public constructor create; procedure stoppen; end; implementation constructor TGluecksrad.create; begin inherited create; wert := 1; end; ist ist TWuerfel TGluecksrad + create + create + stoppen Die Attribute der Superklasse sind hier auch in den Subklassen zugreifbar. 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 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; ... 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.

21 Teil 2 Polymorphie

22 Zielsetzung 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$ 1$
Das Würfelspiel „chuck a luck“ soll – ohne dass der Benutzer es weiß – mal mit idealen, mal mit gezinkten Würfeln gespielt werden. 1 4 1$ 1$ 2 5 1$ 1$ 1$ 1$ 1$ 3 1$ 1$ 1$ 1$ 3 3 6

23 Modellierung Bei einem gezinkten Würfel sollen die Augenzahlen 1..6 mit ungleicher Wahrscheinlichkeit auftreten (z. B. 1: 50%, 2: 10%, 3: 10%, ...). TIdealerWuerfel TGezinkterWuerfel augen augen werfen werfen instance of instance of wuerfelA wuerfelB wuerfelC wuerfelA wuerfelB wuerfelC augen = 3 augen = 3 augen = 5 augen = 1 augen = 1 augen = 1

24 Modellierung Ideale und gezinkte Würfel werden als Spezialisierung eines „allgemeinen“ Würfels konzipiert, der beim Werfen nichts machen soll. TWuerfel - augen: integer + create + werfen // nichts machen + getAugen: integer + setAugen(a: integer) ist ist TIdealerWuerfel TGezinkterWuerfel werfen // Augen von 1..6 werfen // Augen von 1..6

25 Implementierungsversuch
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; begin end; ... TWuerfel - augen: integer + create + werfen // nichts machen + getAugen: integer + setAugen(a: integer) ist ist TIdealerWuerfel TGezinkterWuerfel werfen // Augen von 1..6 werfen // Augen von 1..6

26 Implementierungsversuch
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) ist ist TIdealerWuerfel TGezinkterWuerfel 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; end else {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
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; end else {erzeuge gezinkte Würfel} begin wuerfelA := TGezinkterWuerfel.create; wuerfelB := TGezinkterWuerfel.create; wuerfelC := TGezinkterWuerfel.create; ... procedure ...wuerfelWerfen; begin wuerfelA.werfen; wuerfelB.werfen; wuerfelC.werfen; end; Deklaration: statischer Typ Laufzeit: dynamischer Typ Dynam. Typ: TIdealerWuerfel Statischer Typ: TWuerfel

29 Frühe Bindung / späte Bindung
procedure ...wuerfelWerfen; begin wuerfelA.werfen; ... end; 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. Bei später Bindung wird die Suche der Methode beim dynamischen Typ begonnen. Dynam. Typ: TIdealerWuerfel Dynam. Typ: TIdealerWuerfel Statischer Typ: TWuerfel Statischer Typ: TWuerfel

30 Implementierung von später Bindung
type TWuerfel = class private augen: integer; public constructor create; procedure werfen; virtual; end; implementation procedure TWuerfel.werfen; begin end; ... procedure ...wuerfelWerfen; begin wuerfelA.werfen; ... end; type TIdealerWuerfel = class(TWuerfel) public procedure werfen; override; end; implementation procedure TIdealerWuerfel.werfen; begin setAugen(random(6)+1); end; ... Dynam. Typ: TIdealerWuerfel Statischer Typ: TWuerfel

31 Implementierung von früher Bindung
type TWuerfel = class private augen: integer; public constructor create; procedure werfen; end; implementation procedure TWuerfel.werfen; begin end; ... procedure ...wuerfelWerfen; begin wuerfelA.werfen; ... end; type TIdealerWuerfel = class(TWuerfel) public procedure werfen; end; implementation procedure TIdealerWuerfel.werfen; begin setAugen(random(6)+1); end; ... Dynam. Typ: TIdealerWuerfel Statischer Typ: TWuerfel

32 Abstrakte Methoden type TWuerfel = class private augen: integer; public constructor create; procedure werfen; virtual; abstract; end; implementation // keine Implementierung von werfen Abstrakte Methoden werden in der Superklasse nur deklariert und erst in Subklassen implementiert. type TIdealerWuerfel = class(TWuerfel) public procedure werfen; override; end; implementation procedure TIdealerWuerfel.werfen; begin setAugen(random(6)+1); end; ...

33 Polymorphie 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. zunächst später

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 unit uWuerfel; interface type TWuerfel = class(TObject) private augen: integer; public constructor create; destructor destroy; override; procedure werfen; function getAugen: integer; end; ... Erklären Sie die markierte Stelle. Informieren Sie sich hierzu auch über die in Delphi vordefinierte Klasse TObject.

36 Teil 3 Zusammenfassung

37 Objektorientierung Grundideen Grund- konzepte Objekt Nachricht
Polymorphie Vererbung Beziehung Klasse Modellierungssprache: UML Implementierungssprache: Delphi, Java, ...

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 Helmut Balzert: Lehrbuch Grundlagen der Informatik. Spektrum Ak. Verlag 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 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: Die AG-Informatik des LMZ in RLP stellt u. a. auch Fortbildungsmaterialien zu diesem Thema bereit. Auf der Homepage des HSG in Kaiserslautern findet man Unterrichtsmaterialien und Links zu weiteren interessanten Seiten. ...


Herunterladen ppt "Grundkonzepte der objektorientierten Programmierung Teil 3"

Ähnliche Präsentationen


Google-Anzeigen