Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006.

Ähnliche Präsentationen


Präsentation zum Thema: "Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006."—  Präsentation transkript:

1 Grundkonzepte der objektorientierten Programmierung Teil 3 Klaus Becker 2006

2 2 Objektorientierte Modellierung 1$ Miniwelt Modell System

3 3 Teil 1 Vererbung

4 4 Zielsetzung 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

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

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

9 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

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

11 11 Vererbung TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) TWuerfel + create TGluecksrad + create + stoppen geraetwuerfelrad wert = 3 wert = 5 instance of ist 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 12 Implementierung der Superklasse TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) TWuerfel + create TGluecksrad + create + stoppen geraetwuerfelrad wert = 3 wert = 5 instance of ist instance of 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. Keine Initialisierung

13 13 Implementierung einer Subklasse TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) TWuerfel + create TGluecksrad + create + stoppen geraetwuerfelrad wert = 3 wert = 5 instance of ist 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 14 Implementierung einer Subklasse TZufallsgeraet – wert: integer + create + aktivieren + getWert: integer + setWert(w: integer) TWuerfel + create TGluecksrad + create + stoppen geraetwuerfelrad wert = 3 wert = 5 instance of ist 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 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 type TZufallsgeraet = class private wert: integer; public... Fehler

16 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 type TZufallsgeraet = class protected wert: integer; public... Ok!

17 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 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 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 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 21 Teil 2 Polymorphie

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

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

24 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

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

26 26 Implementierungsversuch TIdealerWuerfelTGezinkterWuerfel 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..6werfen // Augen von 1..5 Die Klasse TIdealerWuerfel wird analog implementiert.

27 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 28 Statischer / dynamischer Typ Statischer Typ: TWuerfel Dynam. Typ: TIdealerWuerfel 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; 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;

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

30 30 Implementierung von später Bindung Statischer Typ: TWuerfel Dynam. Typ: TIdealerWuerfel 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 31 Implementierung von früher Bindung Statischer Typ: TWuerfel Dynam. Typ: TIdealerWuerfel 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 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 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 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 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 36 Teil 3 Zusammenfassung

37 37 Objektorientierung Grundideen ObjektNachrichtBeziehungKlasse Modellierungssprache: UML Implementierungssprache: Delphi, Java,... PolymorphieVererbung Grund- konzepte

38 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 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 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 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 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 Klaus Becker 2006."

Ähnliche Präsentationen


Google-Anzeigen