69
Grundkonzepte der Grundkonzepte der objektorientierten Programmierung objektorientierten Programmierung mit Delphi mit Delphi Helmut Paulus Speyer, 13.05.09

Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Embed Size (px)

Citation preview

Page 1: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Grundkonzepte der Grundkonzepte der objektorientierten Programmierung objektorientierten Programmierung

mit Delphimit Delphi

Helmut Paulus Speyer, 13.05.09

Page 2: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

2 Problem der SoftwareentwicklungProblem der Softwareentwicklung

Die Pflege immer aufwändiger

Ab einer bestimmten Größe versteht niemand mehr das Programm

Das Programm kann nicht mehr geändert werden

Derzeitige Lösung des Problems:

Objektorientierte Programmierung

Entwurfsmuster für graphische Benutzungsoberflächen

u. a. MVC: Modell-Ansicht-Steuerung

Die Größe und Komplexität der Programme nimmt zu

Page 3: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

3 Objekte und KlassenObjekte und Klassen

Statt eines riesigen Programm hat man

Objekte Programmbausteine, die bestimmte Aufgaben eigenständig

lösen

Objekte kooperieren miteinander bei der Lösung eines komplexen Problems

Klassen Baupläne für Objekte

Jedes Objekt gehört zu genau einer Klasse

Objekte mit gemeinsamen Eigenschaften bilden ein Klasse

Page 4: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

MVC-EntwurfsmusterMVC-Entwurfsmuster4

Model/View/Controller

Grundlegendes Konzept zum Aufbau von Benutzerschnittstellen

Model: das Anwendungsobjekt

View: Bildschirmdarstellung des Anwendungsobjekts

Controller: nimmt Benutzereingaben entgegen und modifiziert das Anwendungsobjekt

a = 30%b = 50%c = 20%

a = 30%b = 50%c = 20%

model

views

controller

Tastatureingaben

Kennzeichen: Trennung von Benutzungsoberfläche (GUI) und Fachkonzept (Model)Kennzeichen: Trennung von Benutzungsoberfläche (GUI) und Fachkonzept (Model)

Page 5: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

MVC-UhrMVC-Uhr5

Aufgabe: Eine einfache Uhr mit digitaler Anzeige soll mit Hilfe von

geeigneten Objekten realisiert werden.

Anforderungen:

1. Die Uhr soll dabei vorerst noch nicht selbst laufen.

2. Die Uhr soll als eigenständiger Baustein, der unabhängig von GUI-Objekten ist, entwickelt werden.

12 : 14 : 0412 : 14 : 04

Darstellung

Steuerung

schreibt

liest

GUIGUI

Uhr

Std= 12

Min= 17

Sec = 0

Modell

FachkonzeptFachkonzept

Page 6: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

MVC-ArchitekturMVC-Architektur6

GUI(Graphical User Interface)

Fachkonzept

Model(Daten,Verarbeitung)

Controller

Steuerung

View

Ansicht

schreibt

liest

Informiert ?

View und Controller bilden zusammen die Benutzungsoberfläche (GUI).

Page 7: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Trennung von GUI und DatenmodellTrennung von GUI und Datenmodell7

Das bedeutet:

Das Modell kennt weder View noch Controller. In den Datenklassen werden keine View– oder Controllermethoden aufgerufen!

View und Controller kennen das Modell und lesen und schreiben die Daten.

Zwischen den GUI-Objekten und den MODELL-Objekten werden Verbindungen hergestellt, um einen Datenaustausch zu ermöglichen.

Änderungen der Benutzeroberfläche haben daher keine Auswirkung auf die interne Verarbeitung der Daten und der Datenstruktur.

Verbesserung der Wiederverwendbarkeit

klare Strukturierung eines Programms

Die Daten können gleichzeitig mehrfach auf unterschiedliche Weise dargestellt werden.

Vorteile:

Page 8: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Fragen und ProblemeFragen und Probleme8

Wie erreicht man die Entkopplung?

Wie greifen View und Controller auf die Daten zu?

Wie können die Views aktualisiert werden, wenn das Modell

keinen Zugriff auf sie hat?

Wie erfahren die Views, dass sich die Daten des Modells

geändert haben?

Page 9: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

9 Realisierung in DelphiRealisierung in Delphi

Aktualisierungsmöglichkeiten:• Die Views fragen (evtl. permanent) das Modell ab (Polling).

• Die Views werden durch Ereignisse des Modells über Datenänderungen informiert und aktualisieren sich daraufhin. (Selbstdefinierte Ereignisse)

• Benachrichtigung mittels Beobachter-Muster (Observer-Pattern)

Entkopplung:

• GUI- und Modellklassen in verschiedenen Units halten

• View und Controller in einem Formular (z. B. uGUI.pas) unterbringen

• Modell-Klasse in einer eigenen Unit (z. B. uModell.pas) speichern

Datenzugriff:• Die GUI-Klasse erhält eine Referenz auf das Modell-Objekt.

• Der Datenzugriff erfolgt mit Lese- und Schreibmethoden, des Modells

(z. B. setAttribut() bzw. getAttribut()).

Page 10: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Modellierung der UhrModellierung der Uhr10

Überlegungen zur Objektstruktur•Welche Merkmale sind charakteristisch für eine Uhr, also allen Uhrentypen gemeinsam?•Welche Funktionalitäten gehören zu den Basiseigenschaften einer Uhr? Bzw. Welche Dienste muss eine Uhr zur Verfügung stellen, um ihre Aufgabe zu erfüllen?•Lässt sich das Objekt Uhr noch zerlegen?

Überlegungen zur Objektstruktur•Welche Merkmale sind charakteristisch für eine Uhr, also allen Uhrentypen gemeinsam?•Welche Funktionalitäten gehören zu den Basiseigenschaften einer Uhr? Bzw. Welche Dienste muss eine Uhr zur Verfügung stellen, um ihre Aufgabe zu erfüllen?•Lässt sich das Objekt Uhr noch zerlegen?

OO-Analyse

Identifikation von Objekten: Zähler für Sekunden und Minuten (modulo 60), Zähler für Stunden (modulo 24) Idee: Die Klasse TUhr soll Zählerobjekte modulo einer vorgebbaren Grenze nutzen

können

Attribute:

Zählerstand – Werte von 0 bis Maximalwert

Fähigkeiten: zählt weiter bis ein maximaler Wert erreicht ist, dann wieder bei

Null zurücksetzen in den Startzustand (Zählerstand 0) einen bestimmten (Anfangs-)Zählerstand setzen

Ergebnisse der Analyse:

Page 11: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Modellierung der Klasse TUhrModellierung der Klasse TUhr11

OO-Analyse• Die Uhr besitzt drei Zählerobjekte als

Stunden-, Minuten- und Sekundenzähler.• Stunden, Minuten und Sekunden können

gesetzt werden.• Stunden, Minuten und Sekunden können

ausgelesen werden.• Die Uhrzeit kann schrittweise erhöht

werden.

Kurzbeschreibung:• Das Uhrobjekt verwaltet die

Zählerobjekte, d. h. es erzeugt und vernichtet sie.

• Gemäß dem Geheimnisprinzip werden die Zählerobjekte als private bzw. protected deklariert, sind also dem Benutzer verborgen.

• Der Zugriff erfolgt indirekt mit Hilfe der Set- und Get-Methoden.

OOA-Klassendiagramm

Page 12: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

TModuloZaehler TModuloZaehler 12

TModuloZaehler = class

private

max: integer;

stand: integer;

public

constructor create(m: integer);

procedure setStand(s: integer);

procedure nullSetzen;

procedure weiterZaehlen;

function getStand: integer;

end;

constructor TModuloZaehler.create(m: integer);

begin

max := m;

stand := 0;

end;

Page 13: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

TUhrTUhr13

TUhr = class

protected

min : TModuloZaehler;

sec : TModuloZaehler;

std : TModuloZaehler;

public //Methoden

constructor create;

destructor destroy;override;

procedure ticke;

procedure reset;

….

end;

Uhr verwaltet 3

Zählerobjekte (hat-

Beziehung)

constructor TUhr.create;

begin

std := TModuloZaehler.create(23);

min := TModuloZaehler.create(59);

sec := TModuloZaehler.create(59);

end;

Erzeugung der

Zählerobjekte

Page 14: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

TUhrTUhr14

destructor TUhr.destroy;

begin

std.Free;

min.Free;

sec.Free;

inherited destroy; //geerbten Destruktor aufrufen

end;

Vernichtung der

Zählerobjekte

procedure TUhr.ticke;

begin

sec.weiterZaehlen;

if sec.getStand = 0 then

begin

min.weiterZaehlen;

if min.getStand = 0 then

std.weiterzaehlen;

end;

end;

Die Uhr tickt.

Aktivieren der Zähler

Page 15: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Entwicklung der GUIEntwicklung der GUI15

OO-Entwurf

OOD-Klassendiagramm

Prototyp

Page 16: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

ObjektverwaltungObjektverwaltung16

uses

… mTUhr;

TGUI = class(TForm)

private

{ Private-Deklarationen }

Uhr : TUhr; //Referenzvariable Uhr (als Attribut des Formulars)

procedure zeitAnzeigen; //View-Methode des Formulars

public

{ Public-Deklarationen }

end;

Das Formular verwaltet die GUI-Objekte und das Modellobjekt.

Zeiger auf ein Uhrobjekt hat

Beziehung

Modell-Unit einbinden

procedure TGUI.FormCreate(Sender: TObject);

begin

Uhr := TUhr.create; //Uhrobjekt erzeugen

zeitAnzeigen;

end;

Uhrobjekt erzeugen

Page 17: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Controller / ViewController / View17

procedure TGUI.zeitAnzeigen;

var h,min,sec : integer;

sh,smin,ssec : string;

begin

h := Uhr.GetH; min := Uhr.GetMin; sec := Uhr.getSec;

sh := InttoStr(h); min:= InttoStr(min); ssec:= InttoStr(sec);

if h < 10 then sh := '0'+sh;

…..

PZeitAnzeige.Caption := sh+':'+smin+':'+ssec;

end;

Ereignisprozedurprocedure TGUI.BSetzenClick(Sender: TObject);

var h, min : integer;

begin

h := StrToInt(EdH.text);

min :=StrToInt(EdMin.text);

Uhr.SetMin(min);

Uhr.SetStd(h);

zeitAnzeigen;

end;

Aktualisierung der Anzeige (Polling)

Datenfluss:

Controller Modell

Datenfluss:

Modell View

Page 18: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

18 AufgabenAufgaben

1. Testen Sie das Programm ‚Uhr0’ und verfolgen Sie den Ablauf mit Hilfe des Einzelschritt-Modus (Debugging).

2. Implementieren Sie einen Timer zur automatischen Weiterschaltung der Uhr.

3. Erzeugen Sie im Formular eine zweite Uhr.

4. Ersetzen Sie die Digitalanzeige durch ein Analoganzeige (TZiffernblatt)

5. Implementieren Sie ein selbstdefiniertes Ereignis, sodass die Uhr die GUI bei Zustandsänderung informieren kann.

6. Die Uhr soll laufen lernen. Bauen Sie dazu einen Timer in das Uhrobjekt ein.

Hinweis:

Verwenden Sie folgende Seiten und die Delphi-Hilfe.

Page 19: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Uhr mit EreignisUhr mit Ereignis

Helmut Paulus Speyer, 13.5.09

Page 20: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

20

Das Uhrobjekt soll die Ansicht über Datenänderungen informieren.

Dazu wird ein Ereignis implementiert, das bei Datenänderung ausgelöst wird,

also in den set-Methoden. Das Modell erhält einen Methodenzeiger, der mit

einer Methode des Formulars verknüpft werden kann.

Die Schritte (1) – (3) erfolgen im Modellobjekt, Schritt (4) im Formular.

Ein Ereignis für das UhrobjektEin Ereignis für das Uhrobjekt

Page 21: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Implementation des EreignissesImplementation des Ereignisses21

type

TEreignis = procedure of object; (1.)

TUhr = Class

.... public

OnChanged : TEreignis; (2.)

…..

end;

Ereignis: OnChanged vom Typ TEreignis

1. Deklaration eines Methodenzeigertyps (hier: für eine Prozedur ohne Parameter)

2. Deklaration einer Referenzvariable vom Typ des Methodenzeigers

Methode ohne Parameterliste

Page 22: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Auslösen des Ereignisses (3)Auslösen des Ereignisses (3)22

procedure TUhr.ticke;

begin

….

//GUI informieren

if assigned(OnChanged) then OnChanged; (3)

end;

Wirkung:

Das Modellobjekt ruft die mit OnChanged verknüpfte Methode des

Formulars auf.

Mit Hilfe der Funktion assigned() wird geprüft, ob der Methodenzeiger mit einer Methode verknüpft ist.

Dieselbe Wirkung hätte die Anweisung: if OnChanged <> nil then OnChanged;

Modell:

3. Ereignis auslösen

Anmerkung:

Mit Hilfe von Methodenzeigern kann das Modell GUI-Objekten eine Nachricht schicken (Methode aufrufen), ohne dass es diese kennt.

Das Modell hat keine Referenz (Objektvariable), die auf ein GUI-Objekt zeigt!

Page 23: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

EreignisbearbeitungsmethodeEreignisbearbeitungsmethode23

type

TGUI = class(TForm)

...

private

Uhr : TUhr;

procedure zeitAnzeigen;

public

...

end;

Verknüpfen des Methodenzeigers mit der Ereignismethode in FormCreate

Ereignismethode

für das OnChanged-Ereignis

GUI-Klasse:

procedure TGUI.FormCreate(Sender: TObject);

begin

Uhr := TUhr.create; //Uhrobjekt erzeugen

Uhr.OnChanged := zeitAnzeigen; (4)

end;

Methodenname

(keine Parameter)

Page 24: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Uhr mit TimerUhr mit Timer

Helmut Paulus Speyer, 13.5.09

Page 25: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Uhr mit TimerUhr mit Timer25

Das Uhrobjekt erhält eine private Timerkomponente, die die Zeit im Sekundentakt erhöht.

Das Uhrobjekt ist für die Erzeugung und Zerstörung des Timerobjekts zuständig.

Hat - Beziehung

weiter

Ereignismethode für das Timer-Ereignis OnTimer

Hat - Beziehung

Page 26: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

ImplementierungImplementierung26

uses mTModuloZaehler, extctrls;

type TUhr = Class

protected

std : integer;

min : integer;

Sec : integer;

Timer : TTimer;

procedure weiter(Sender:TObject);

public

constructor create;

destructor destroy; override;

... end;

Objektreferenz

wegen TTimer

Ereignismethodedes Timers

Die Ereignismethode des Timers erwartet einen Parameter Sender vom Typ TObject. Daher kann die Methode ticke nicht mit dem Timerereignis OnTimer verknüpft werden.

Als Timerereignismethode kommt daher die Methode weiter(Sender : TObject) hinzu, die dann ticke aufruft.

Page 27: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Erzeugung und Vernichtung des TimersErzeugung und Vernichtung des Timers27

constructor TUhr.create;

begin

Timer := TTimer.create(nil);

with Timer do

begin

interval := 1000;

enabled := true;

OnTimer := weiter

end;

end;

Methodenzeiger mit der Ereignismethode verknüpfen

Erwartet wird eine Referenz auf den Besitzer der Komponente: Objekt vom Typ TComponent oder nil.

destructor TUhr.destroy;

begin

Timer.free;

inherited destroy;

end;

Aufruf des Destruktors der Basisklasse TObject

Freigabe des Objekts

Page 28: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Vererbung - SpezialisierungVererbung - Spezialisierung

Helmut Paulus Speyer, 13.05.09

Page 29: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

ZielZiel

Lösung durch Vererbung

Eine Klasse von Objekten kann als Spezialfall einer allgemeineren Klasse definiert werden.

29

Aufgabe:

Zu entwickeln ist eine Uhr, die zu einer voreingestellten Uhrzeit ein Alarmzeichen ausgibt.Wünschenswert wäre,

möglichst viel von der Klasse TUhr verwenden zu können,

möglichst wenig zusätzlichen Code entwickeln zu müssen.

Codewiederholungen vermeiden zu können.

Die Objekte der spezialisierten Klasse

verfügen über alle Merkmale und Methoden der allgemeinen Klasse,

erweitern diese aber ggf. um zusätzliche Eigenschaften (Attribute und Methoden),

können die geerbten Methoden durch Überschreiben neu definieren.

Die Objekte der spezialisierten Klasse

verfügen über alle Merkmale und Methoden der allgemeinen Klasse,

erweitern diese aber ggf. um zusätzliche Eigenschaften (Attribute und Methoden),

können die geerbten Methoden durch Überschreiben neu definieren.

Page 30: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

30 Vererbung - SpezialisierungVererbung - Spezialisierung

TWecker

# AlarmMin : integer

# AlarmStd : integer+ OnAlarm : TEreignis

+!ticke

Basisklasse

gemeinsamer Kern

abgeleitete Klasse

(Unterklasse)

Erweiterungen

Generalisierung

Spezialisierung

Die Basisklasse TWecker als Spezialisierung der Klasse TUhr

TUhr

# timer : TTimer

#!weiter(Sender : TObject)

+ OnChanged : TEreignis

+!ticke

ist ein - Beziehung

In der Methode ticke soll der Alarm ausgelöst werden, falls die Alarmzeit erreicht ist; ticke wird daher in der Unterklasse erweitert.

Die Basisklasse wird nicht mehr verändert!

Page 31: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Überschreiben einer MethodeÜberschreiben einer Methode31

procedure TWecker.ticke;

begin

inherited ticke; //Methode der Basisklasse

//Alarm auslösen, falls Alarmzeit erreicht

end;

procedure TUhr.ticke;

begin

//Zeit erhöhen

//OnChanged-Ereignis auslösen

end;

Zunächst die Methode der Basisklasse aufrufen, um das Standardverhalten auszulösen.

Es folgen die speziellen Aktivitäten des Weckers.

Dazu wird die ticke-Methode überschrieben.

Deklaration der Methode ticke als virtuelle Methode

ticke wird in der Basisklasse mit dem Schlüsselwort virtual gekennzeichnet .

TUhr = class procedure ticke;virtual;

end;

TWecker = class(TUhr) procedure ticke;override;

end;

ticke wird in der Unterklasse mit override

gekennzeichnet und neu implementiert,

damit wird die Methode überschrieben.

Das Verhalten der Uhr beim Ticken wird erweitert.

Page 32: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Verhalten virtueller MethodenVerhalten virtueller Methoden32

Bei virtuellen Methoden wird erst zur Laufzeit entschieden, welche Methode aktiviert wird.

Der Typ des aktuellen Objekts bestimmt die Methode.

Problem:

Welche Methode wird aufgerufen, wenn der Timer, der in TUhr deklariert ist, die Methode ticke aufruft?

Weiteres Beispiel:

Mehrere Uhren unterschiedlichen Typs werden in einem Array des Basistyps gespeichert.

var Uhren : Array[1..10] of TUhr;

for i := 1 to 10 do

Uhren[i].ticke;

Je nach Objekttyp wird die passende Methode aufgerufen!

Nicht virtuelle Methoden haben diese Verhalten nicht!

Sie sind statisch, d. h. schon beim Compilieren wird die Methode festgelegt!

Page 33: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

PolymorphismusPolymorphismus33

Das Konzept der dynamischen Bindung heißt in der OOP

Polymorphismus (Vielgestaltigkeit).

Merkmale Bei polymorphen Objektenvariablen entscheidet sich erst zur Laufzeit,

welcher Klasse das Objekt angehört.

Eine in einer Basisklasse als virtual deklarierte Methode definiert eine Schnittstelle für alle abgeleiteten Klassen, auch wenn diese noch nicht festgelegt sind.

Ein Programm, das virtuelle Methoden einer Basisklasse enthält kann sehr leicht um abgeleitete Klassen erweitert werden, weil sichergestellt ist, dass stets die richtige Methode aufgerufen wird.

Empfehlung Statische Methoden einer Basisklasse sollten nicht überschrieben

werden.

Wenn Überschreiben notwendig erscheint, sollte die Methode als virtual deklariert werden.

Page 34: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

34 AufgabeAufgabe

1. Testen Sie das Programm ‚Wecker’ und ergänzen Sie den fehlenden Quellcode.

2. Entwickeln Sie mit Hilfe zweier Wecker eine SchachuhrZwei Uhren, die sich gegenseitig an- und abschalten nach Prinzip:

• Wenn die Partie gestartet ist, läuft die Uhr desjenigen, der am Zug ist, los.

• Nachdem der Spieler seinen Zug ausgeführt hat stoppt er seine Uhr, gleichzeitig startet automatisch die Uhr des Gegners.

• Jeder Spieler nur eine bestimmte Zeitspanne für die Partie zur Verfügung, die auf der Schachuhr zuvor eingestellt wird.

3. Entwickeln Sie eine Weltzeituhr.

• Eine Uhr, die die aktuelle Uhrzeit der verschiedenen Zeitzonen anzeigen kann.

• Als Basiszeit dient dabei die Zeit am nullten Längengrad.

• Die Basisuhrzeit wird festgelegt, die Uhrzeiten der anderen Zeitzonen errechnen sich durch Hinzufügen oder Abziehen einer ganzzahligen Anzahl von Stunden.

Page 35: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Vererbung - GeneralisierungVererbung - Generalisierung

Helmut Paulus Speyer, 13.5.09

Page 36: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

BankprodukteBankprodukte36

Problem: Vielfalt der Objektetypen

Sie sind zwar ähnlich, aber doch verschieden sind!

Idee:

• Suche nach Gemeinsamkeiten!

• Organisiere sie in einer Hierarchie!

• Implementiere zuerst den gemeinsamen Kern!

• Implementiere dann nur noch die Unterschiede!

Girokonto

Sparkonto

Depotkonto

Festgeldkonto

Page 37: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

VererbungVererbung37

Sparkonto Girokonto FestgeldkontoNummer

Inhaber

Stand

Nummer

Inhaber

Stand

Zeitraum

Nummer

Inhaber

Stand

Kündigungsfrist

einzahlen

auszahlen

einzahlen

auszahlen

einzahlen

auszahlen

Unterschiedliches Verhalten:

Sparkonto

Kündigungsfrist, kein Überziehen möglich

Girokonto

Überweisungen, Scheck, Dispositonskredit

Festgeldkonto

Einzahlen und Auszahlen eingeschränkt, Mindesteinlage

Unterschiedliches Verhalten:

Sparkonto

Kündigungsfrist, kein Überziehen möglich

Girokonto

Überweisungen, Scheck, Dispositonskredit

Festgeldkonto

Einzahlen und Auszahlen eingeschränkt, Mindesteinlage

Page 38: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

VererbungshierarchieVererbungshierarchie

Konto ist der abstrakte Oberbegriff für die drei Formen

Gemeinsame Basisklasse: TKonto

Konto ist der abstrakte Oberbegriff für die drei Formen

Gemeinsame Basisklasse: TKonto

38

TSparkonto TGirokonto TFestgeldkonto

TKonto

• Die Basisklasse enthält den gemeinsamen Kern.

• Spezialisierte Klassen werden von der Basisklasse abgeleitet;sie fügen spezielle Attribute und Operationen hinzu oder definieren bestimmte Dinge neu.

Page 39: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Abstrakte MethodenAbstrakte Methoden39

Die Basisklasse Konto kann die Methode auszahlen nicht sinnvoll implementieren, weil sie zu allgemein ist.

Um einen gleichartigen Aufruf der Methode zu gewährleisten, muss sie dennoch in der Basisklasse enthalten sein. (z. B. mit leeren Rumpf)

Deklariert man die virtuelle Methode der Basisklasse als abstrakte Methode, so entfällt die Implementation.

procedure TGirokonto.auszahlen ();

begin

//Dispo prüfen

//Kontostand berechnen

//Gebühren berechnen

end;

procedure TSparKonto.auszahlen ();

begin

//ist Konto gedeckt ?

//Kontostand berechnen

end;

procedure TKonto.auszahlen ();

begin

end;

Page 40: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Abstrakte KlassenAbstrakte Klassen40

Kennzeichen abstrakter Klassen:

Abstrakte Klassen enthalten mindestens eine abstrakte virtuelle Methode, die überschrieben werden muss.

Von abstrakten Klassen können keine Instanzen gebildet werden.

Abstrakte Klasse bilden eine gemeinsame Schnittstelle für alle Unterklassen.

TKonto = class ...

procedure auszahlen;virtual;abstract;...

end;

TKonto mit der abstrakten Methode auszahlen

Implementierung in Basisklasse entfällt

Muss in allen Unterklassen überschrieben werden

Page 41: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

KlassendiagrammKlassendiagramm41

Page 42: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

42 AufgabenAufgaben

1. Testen Sie das Programm ‚Konten’ und vervollständigen Sie die Auszahlungsmethoden.

Page 43: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Anhang 1Anhang 1

Helmut Paulus Speyer, 13.05.09

Page 44: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

ZuweisungskompatibilitätZuweisungskompatibilität44

Typumwandlung: as - Operator

wecker := Uhr as TWecker;

(Uhr as TWecker).setAlarm(6);

TWecker(Uhr).setAlarm(6);

Konsequenz der „ist ein“ – Beziehung:

Einer Objektvariablen einer Oberklasse können Objekte aller Unterklassen

zugewiesen werden. Die Umkehrung gilt nicht.

Beispiel:Var

uhr : TUhr; wecker : TWecker;

wecker := TWecker.create(...);

Möglich:

Uhr := Wecker;

Uhr.setStd(12);

Nicht möglich:

Uhr.setAlarmStd(6)

Uhr ist eine Referenz auf den Teil des Weckerobjekts, der von TUhr geerbt wird.

Zuweisungskompatibilität

Page 45: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Delphis KlassenhierarchieDelphis Klassenhierarchie

Alle Delphi-Objekte sind Nachfahren eines Urobjekts - Klasse TObject.

TObject

implementiert das grundlegende Verhalten, das allen Delphi-Objekten gemeinsam ist.(z. B. Standardkonstruktor, -destruktor)

dient als Basis für einfache Objekte (keine Komponenten, keine Stream- oder Zuweisungsfunktionen)

45

Alle Klassen die von TComponent abgeleitet sind heißen Komponenten,viele davon stehen in der Komponentenpalette (VCL) der Entwicklungsumgebung zur Entwurfszeit zur Verfügung.

Komponenten (VCL)

Beispiele:

TForm1 = class(Tform) - TForm1 erweitert die vorgebene Klasse TForm

TKonto = class(TObject) - Konto von TObject abgeleitet

Wenn bei der Deklaration eines neuen Objekttyps kein Vorfahr angegeben wird, setzt Delphi als Vorfahr automatisch die Klasse TObject ein.

Page 46: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Delphis Klassenbibliothek (Auszug)Delphis Klassenbibliothek (Auszug)46

Page 47: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Anhang 2Anhang 2GrundkonzepteGrundkonzepte

Helmut Paulus Speyer, 13.05.09

Page 48: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Zusammenfassung OOPZusammenfassung OOP48

OOP-Idee:Vorstrukturierung komplexer Systeme anhand natürlicher ObjekteJedes Objekt hat Fähigkeiten und EigenschaftenVerteilung von Aufgaben (Zuständigkeiten)

Prinzipien: Objekt und KlasseGeheimnisprinzip Beziehung/AssoziationVererbung

Eine Klassen-Deklaration besteht aus Deklarationen von: Attributen für die verschiedenen Eigenschaftender Objekte Konstruktoren zur Erzeugung und Initialisierung der Objekte Methoden, d.h. Operationen (Algorithmen) auf Objekten

UML-KlassendiagrammZeigt die Klassen einer Anwendung und die Beziehungen zwischen diesen Klassen.

Es liefert Informationen über den Aufbau der Anwendung.

Entwurfsprinzip: Trennung von GUI und Modell (MVC)

Page 49: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

49 Klassen und ObjekteKlassen und Objekte

Klassen sind Baupläne von Objekten.

Objekte sind konkrete Exemplare (Instanzen) von Klassen.

Objekte

Klasse

Konto1

Nummer = 100

Stand = 10000

Konto2

Nummer = 101

Stand = 2000

Konto3

Nummer = 102

Stand = 5500

TKonto

Nummer

getKontoStand

ist Instanz von

Page 50: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

50 GeheimnisprinzipGeheimnisprinzip

abheben einzahlen

überweisen

Nummer: 101 Besitzer: MüllerStand: 1000€

Direkter Zugriff auf Attribute nicht möglich.

Nur indirekter Zugriff mit Hilfe von Methoden (set-/get).

Direkter Zugriff auf Attribute nicht möglich.

Nur indirekter Zugriff mit Hilfe von Methoden (set-/get).

Objekte stellen Operationen/Dienste (Algorithmen) und Informationen zur Verfügung. Die innere Struktur bleibt dem Benutzer verborgen.

Attribute – speichern den Zustand des Objekts

Methoden – abheben, überweisen, einzahlen usw.

Die Operationen (Algorithmen) auf Objekten einer Klasse heißen auch Methoden, genauer: Objekt-Methoden.

Page 51: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

51 Modellierung der KlasseModellierung der Klasse

TKonto

- Nummer : integer

- Besitzer : string

- Stand : double

+ Constructor create(...);

+ !abheben (PBetrag: double);

+ !einzahlen (PBetrag: double);

+ !ueberweisen(...);

+ ?getBesitzer : string;

+ ?getKontoNummer : integer;

+ ?getKontoStand : double;

Konstruktor (erzeugt ein Objekt)

UML-Klassendiagramm

Zugriffsrechte:

- privat (Zugriff nur innerhalb des Objekts)

+ öffentlich (Zugriff auch von außerhalb)

Anfragen /Funktionen

(Lesezugriff auf die Attribute)

Aufträge (Dienste)/Prozeduren

Page 52: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

52 Implementierung der KlasseImplementierung der Klasse

type

TKonto = class

private

KStand : double;

Nummer : integer;

Besitzer : string;

public

constructor Create (PNr: integer; PBesitzer: string);

procedure abheben (PBetrag: double);

procedure einzahlen (PBetrag: double);

procedure ueberweisen(PBetrag:double;PEKonto: TKonto);

function getBesitzer : string;

function getKontoNummer : integer;

function getKontoStand : double;

end;

type

TKonto = class

private

KStand : double;

Nummer : integer;

Besitzer : string;

public

constructor Create (PNr: integer; PBesitzer: string);

procedure abheben (PBetrag: double);

procedure einzahlen (PBetrag: double);

procedure ueberweisen(PBetrag:double;PEKonto: TKonto);

function getBesitzer : string;

function getKontoNummer : integer;

function getKontoStand : double;

end;

private

Zugriff von außen nicht möglich

public

Zugriff von außen möglich

Page 53: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

53 KonstruktorenKonstruktoren

constructor TKonto.create ( PNr: integer; PBesitzer: string);

begin

Nummer := PNr;

Besitzer := PBesitzer;

end;

Konstruktoren sind Klassenmethoden, d. h. sie sind nicht an ein Objekt gebunden.Beim Aufruf wird daher der Klassenname vorangestellt.

Konstruktoren haben eine Objektreferenz als Ergebnis,

aber keine Rückgabezuweisung (result := ... ) und folglich auch keinen Ergebnistyp.

Alle Delphiklassen besitzen einen Standardkonstruktor Create, der ersetzt wird, wenn man ihn neu implementiert.

Objekte werden mit Hilfe der Konstruktoren erzeugt:

Der Konstruktor

• legt den Speicherbereich des Objekts an,

• belegt die Attribute mit Standardwerten,

• gibt eine Referenz auf das erzeugte Objekt zurück.

Page 54: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

54 Erzeugung von ObjektenErzeugung von Objekten

var Konto1 : TKonto;

...

...

Konto1 := TKonto.create(102, ‘Müller‘);

Klassenname

Das Objekt existiert noch nicht !

Deklaration der Objektvariablen

nilKonto1

Konto

Nummer = 102

Besitzer = Müller

Stand = 0

Konto1Konto1Die Objektvariable Konto1 erhält

eine Referenz (Zeiger) auf das erzeugte Kontoobjekt.

Wirkung:

Objekte freigeben (Speicherfreigabe) durch Aufruf eines Destruktors

Konto1.FreeKonto1.Free Destruktor Free, von TObject

geerbt

Destruktor Free, von TObject

geerbt

Page 55: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

55 Arbeiten mit ObjektenArbeiten mit Objekten

Der Zugriff auf Objekte erfolgt mit Hilfe der Objektvariablen

Schema: Objektvariable.Methode

Das GUI-Objekt ruft eine Methode des Kontoobjekts auf.

Beispiel: Konto1.abheben(500)

Page 56: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

56 NachrichtNachrichtKommunikation zwischen Objekten

Überweisen

procedure TKonto.ueberweisen (Pbetrag : double; PEKonto : TKonto);

begin

abheben(PBetrag); //Betrag vom Konto abbuchen

PEKonto.einzahlen(PBetrag); //Betrag auf Empfängerkonto einzahlen

end;

Empfängerkonto

konto2konto1

Senderkonto

PEKonto.einzahlen(400)

Konto1.ueberweisen (400, konto2)

Das Objekt Konto1 schickt dem Objekt Konto2 eine Nachricht.

Das Objekt Konto1 schickt dem Objekt Konto2 eine Nachricht.

Page 57: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

AssoziationAssoziation57

Der Besitzer hat Objekte einer anderen Klasse. Er ist für die Verwaltung (Erzeugung und Löschen) der anderen Objekte zuständig.

Hat-Beziehung

Ein Objekt vom Typ KlasseB ist Teil eines Objekts von Typ KlasseA

Damit Objekte miteinander kommunizieren können, müssen Beziehungen

zwischen ihnen bestehen.

Kennt-Beziehung

Dient der Kontaktaufnahme zweier autonomer Objekte

Wenn ein Objekt ein anderes Objektes aktivieren soll, muss es eine Referenz auf dieses Objekt besitzen.

Page 58: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Anhang 3Anhang 3Phasen der Phasen der SoftwareentwicklungSoftwareentwicklung

Helmut Paulus Speyer, 13.05.09

Page 59: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Software-EntwicklungsmodellSoftware-Entwicklungsmodell59

Analyse Entwurf Codierung

Modellierungskonzepte bei allen Schritten:

Identifizieren und Definieren von abgeschlossenen autonomen Einheiten, die Struktur und Verhalten besitzen.

Suchen nach Gemeinsamkeiten im Sinne der Generalisierung / Spezialisierung.

Die Grenzen zwischen den Aktivitäten verschwimmen.

OO-Analyse OO-Design OO-Programmierung

Entwicklungsphasen

Page 60: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

OOA - OOD - OOPOOA - OOD - OOP60

OOA

WAS soll das System tun? — nicht WIE

Funktionalität durch Anwendungsfälle beschreiben

Objekte (Gegenstände) und Klassen (Begriffe) identifizieren

Verantwortlichkeiten identifizieren und den Klassen zuordnen

Zusammenarbeit zwischen den Klassen identifizieren (Beziehungen)

Hierarchien definieren (Vererbung)

OOD

WIE soll das System arbeiten?

Verfeinern des Objektmodells (Vererbung, Abstraktion) zu einem implementierbaren Modell (Festlegung der Schnittstellen, Besonderheiten der Programmiersprache)

Anpassung des Modells an die technische Plattform, Entwicklung und Anbindung der Benutzungsoberfläche

OOP

Implementierung der Klassen und der Interaktionen zwischen den Objekten

Page 61: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

61 Objektorientierter EntwurfObjektorientierter Entwurf

Wesentliches Entwurfsziel ist die Trennung Fachkonzept, Benutzungs-oberfläche (GUI) und Datenhaltung.

BankkontoBankkontoReale WeltReale Welt

Entwicklungsphasen

KontoOO-Analyse

GUI Fachkonzept

Datenhaltung

AnsichtSteuerung

Konto KontoDateiOO-Design

OOP TGUI TFileTKonto

Page 62: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Anhang 3Anhang 3KursarbeitKursarbeit

Helmut Paulus Speyer, 13.05.09

Page 63: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Kursarbeit 1 (Auszug)Kursarbeit 1 (Auszug)63

1. Schachuhr:

Dabei handelt es sich eigentlich um zwei Uhren, die sich gegenseitig an- und abschalten. Das Ganze funktioniert nach folgendem Prinzip:

Wenn die Partie gestartet ist, läuft die Uhr desjenigen, der am Zug ist, los. Nachdem der Spieler seinen Zug ausgeführt hat stoppt er seine Uhr, gleichzeitig startet automatisch die Uhr des Gegners. Dabei hat jeder Spieler nur eine bestimmte Zeitspanne für die Partie zur Verfügung, die auf der Schachuhr zuvor eingestellt wird – je nach Schachform (z. B. Blitzschach oder Turnierschach) zwischen 5 Minuten und zweieinhalb Stunden.

Es soll ein Programm entwickelt werden, das eine solche Schachuhr simuliert. Dazu wird die leicht modifizierte Uhrenklasse TUhr aus dem Unterricht und eine GUI-Klasse zur Analoganzeige der Zeit zur Verfügung gestellt.

a) Analysiere das Klassendiagramm (siehe Dokumentation) und erläutere die verschiedenen Beziehungen zwischen den Klassen. Erläutere, in welcher Weise hier das MVC-Prinzip realisiert ist Nenne und begründe Vor- und Nachteile dieses Entwurfkonzepts.

b) Modelliere mit Hilfe der zur Verfügung gestellten Klassen die Schachuhr. Stelle das Ergebnis in einem OOD-Klassendiagramm dar. Die Abbildung zeigt einen Prototyp.

c) Leider hat der Programmierer noch einige wichtige Fähigkeiten der Uhrobjekte vergessen:

i. die Uhren laufen noch nicht selbständig

ii. bei Überschreiten der max. Spielzeit sollen die Uhren Alarm auslösen, damit das Spiel abgebrochen werden kann

Erläutere, wie du die Klasse TUhr erweiterst, um die gewünschte Funktionalität zu erzielen.Gehe dabei insbesondere auf den Benachrichtigungsmechanismus ein.

d) Setze deine Überlegungen um, indem du das vorgebenene Delphi-Projekt erweiterst. (Arbeit am PC)

Weitere Pflichten: • Weiß beginnt, Schwarz startet also die Uhr.• Die Bedenkzeit für jeden Spieler wird auf 5 Minuten eingestellt (nicht editierbar) • Zeitüberschreitung wird angezeigt und damit das Spiel beendet.

Page 64: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Kursarbeit 1 (Anhang) Kursarbeit 1 (Anhang) 64

Dokumentation der Klasse "TZiffernblatt" 

Beschreibung der Klasse:

Analoganzeige einer Uhr

reagiert auf das OnChanged-Ereignis des Uhrobjekts

Bezugsklasse: TImage.

Objektbeziehungen

TUhr (Beziehungstyp: Kennt, Kardinalität 1)

Attribute

myUhr : TUhr Referenz auf das Uhrobjekt, dessen Zeit angezeigt wird

Protokoll der Dienste / Methoden

Konstruktor

Create(Owner : TComponent)

Auftrag

aktualisiereAnzeige(uhr : TUhr)

nachher: zeigt die aktuelle Zeit des übergebenen Uhrobjekts an

Auftrag

setzeMyUhr(uhr : TUhr)

nachher: Attribut MyUhr ist gesetzt und OnChanged-Ereignis mit

der privaten Methode aktualisiere

Auftrag

zeigeZeit(h : integer, min : integer, sec : integer)

nachher: die übergebene Zeit wird angezeigt

Dokumentation der Klasse "TUhr"

Beschreibung der Klasse:

Attribute

OnChanged : TEreignis

Wird ausgelöst, wenn sich die Zeit geändert hat

 Protokoll der Dienste / Methoden

Konstruktor

constructor create (pH: integer; pMin: integer);

nachher: Uhr erzeugt std, min gesetzt

Auftrag

ticke()

nachher: Zeit um 1 Sekunde erhöht, OnChanged aufgerufen

Auftrag

reset()

Page 65: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Kursarbeit 1 (Auszug)Kursarbeit 1 (Auszug)

2. Ampelanlage:

An einer Landstraße muss der Straßenverkehr wegen Bauarbeiten zeitweilig auf eine Spur eingeschränkt und mit einer Ampelanlage geregelt werden. Ein Programm soll zwei Verkehrsampeln mit ihren Funktionen und den Straßenverkehr an der Baustelle simulieren und auf dem Bildschirm darstellen.

• Jede Ampel o zeigt die Phasen ROT-ROTGELB-GRUEN-GELB nach

einander mit verschiedenen Zeitdauern.o wird von einer separaten zentralen Steuerung geschaltet.

• Sensoren vor den Ampeln registrieren die Anzahl der haltenden Autos und lösen einen Schaltzyklus aus.

• Die Anlage soll einen einspurigen Verkehr sichern und im Dauerbetrieb laufen

65

a) Erläutere an diesem Beispiel die einzelnen Phasen eines objektorientierten Software-Entwurfs.

b) Führe eine OO-Analyse durch. Stelle deine Ergebnisse in einem Klassendiagramm dar und erläutere es kurz ( Attribute, Methoden, Beziehungen).

c) Beschreibe die verschiedenen Ampelzustände mit Hilfe eines Zustandsdiagramms und entwickle für einen komplette Schaltzyklus der Steueranlage ein Aktivitätsdiagramm.

d) Stell dir vor, dass du Leiter einer Arbeitsgruppe bist, die die Software entwickeln soll. Nenne Teilgruppen, die du zur Lösung des Problems bilden würdest, und ordne jeder Teilgruppe Aufgaben zu.

Page 66: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Kursarbeit 2 Kursarbeit 2

1. Weltzeituhr

Eine Weltzeituhr ist eine Uhr, die die aktuelle Uhrzeit der verschiedenen Zeitzonen anzeigen kann. Als Basiszeit dient dabei die Zeit am nullten Längengrad:

Die Basisuhrzeit wird festgelegt, die Uhrzeiten der anderen Zeitzonen errechnen sich durch Hinzufügen oder Abziehen einer ganzzahligen Anzahl von Stunden.

Pflichten:

(1) Es soll ein Programm entwickelt werden, das wie im Bild drei Weltzeituhren enthält, die die Uhrzeit einer bestimmten Weltstadt (Zeitzone) anzeigen.

(2) Die im Unterricht entwickelte Klasse TUhr ist zu dazu zu erweitern.

(3) Die Uhren laufen nicht selbst, sondern werden synchron von außen gesteuert. Die Zeitanzeige ist digital.

66

a) Erläutere den grundsätzlichen Unterschied zwischen der prozeduralen und der objektorientierten Programmierweise. Beziehe dich dabei auf eines der Unterrichtsprojekte.

b) Analysiere das Klassendiagramm und erläutere die verschiedenen Beziehungen zwischen den Klassen.Erläutere insbesondere die Beziehung zwischen dem Uhrobjekt und der Panelkomponente! Wie wird diese Beziehung programmiertechnisch realisiert? (Anweisungen)

c) Erweitere die Klasse TUhr um geeignete Attribute/Methoden und ergänze evtl. den Quellcode schon existierender Methoden so, dass die oben beschriebene Funktionalität gegeben ist. Zur Initialisierung soll ein geeigneter Konstruktor entwickelt werden.

d) Begründe deine Entscheidungen kurz und stelle das Ergebnis in einem erweitereten UML-Klassendiagramm dar.

e) Implementiere eine GUI mit drei laufenden Uhren wie im Bild. Verwende die Unit uWUhr.pas.Zeitzonen: Budapest +1, Detroit – 6, Aukland +11

Page 67: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Kursarbeit 2Kursarbeit 267

Klassendiagramm

Page 68: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Kursarbeit 2Kursarbeit 268

TelefonbuchTelefonbuch

Anton Meyer084/1234false

2. Telefonbuch

In Handys oder PDAs (Personal Digital Assistant) findet man kleine Applikationen, die als Telefonbuch oder Merkzettel dienen. Diese stellen meist keinerlei Datenbankfunktionalität bereit – allerhöchstens sind sie in der Lage die Einträge zu sortieren. Man kann sie gut mit einem Karteikasten vergleichen, der eine bestimmte Sorte Karteikarten bereithält.

Betrachte ein vereinfachtes Telefonbuch, bei dem die Einträge unsortiert gespeichert werden und ihre Anzahl auf 10 begrenzt sein soll.

a) Modelliere ein Telefonbuch, das mit Hilfe der Modellklassen TTelefonbuch und TEintrag aufgebaut wird. Es enthält Einträge mit den Attributen Nummer (interne automatisch erzeugte Nummerierung), Name, Telefonnummer sowie ein Ja/Nein-Feld für Kurzwahl (d. h. der Eintrag ist einer Kurzwahltaste zugeordnet).

Folgende Operationen sollen möglich sein:

• eine neuer Eintrag wird angelegt, dabei wird er automatisch nummeriert und

• nach Angabe einer Nummer wird der zugehörige Eintrag als Zeichenkette ausgegeben.

Begründe deine Entscheidungen und stelle das Ergebnis in einem UML-Klassendiagramm dar. Erläutere die Beziehung zwischen den Klassen.

b) Implementiere die Konstruktoren beiden Klassen, sowie eine Methode zum Einfügen eines neuen Eintrags ins Telefonbuch.

c) Erzeuge ein Telefonbuch mit maximal 10 Einträgen und füge folgende Einträge ein.[Anton, Meyer, 0675/1234, ja], [ Uwe, Ochsenknecht, 084/1234, nein]Gib auch die notwendigen Variablendeklarationen an und erläutere sie.

d) Schreibe eine GUI-Methode, die das gesamte Telefonbuch (Einträge als Strings) in einer Listbox ausgibt. Verwende: die Methode Listbox.items.add( s : string) zur Ausgabe der Daten

Page 69: Grundkonzepte der objektorientierten Programmierung mit Delphi Helmut Paulus Speyer, 13.05.09

Links und LiteraturLinks und Literatur

E. Modrow: Informatik mit Delphi, Band 1/2, Dümmler-Stam 1998-2000.

P. Damann, J. Wemßen: Objektorientierte Programmierung mit Delphi, Band 1. Klett-Verlag 2001.

U. Bänisch: Praktische Informatik mit Delphi, Band 1/2. Cornelsen 2001.

Frischalowski: Delphi 5.0, Band 1/2, Herdt-Verlag 1999.

Pohl: Schülerübungen / Klausuren in Delphi, Heft 1/2, Verlag J. Pohl 1997-2001.

K. Merkert:http://hsg.region-kaiserslautern.de/faecher/inf/material/delphi/index.php

R. Mechling:http://www.gk-informatik.de/

K. Heidler:http://www.friedrich.fr.schule-bw.de/delphi/delphi.htm

Hessischer Bildungsserver:http://lernen.bildung.hessen.de/informatik/

Katja Weishaupt

http://lernen.bildung.hessen.de/informatik/material/weishaupt.pdf

S. Spolwig: http://oszhdl.be.schule.de/gymnasium/faecher/informatik/delphi/index.htm

Daniel Garmannhttp://projekte.gymnasium-odenthal.de/informatik/

Weitere Hinweise unter:

http://www.delphi-source.de

Einsteiger-Tutorial

http://www.delphi-treff.de/content/tutorials/einsteigerkurs/

69