grundkonzepte der objektorientierten programmierung mit delphi helmut paulus speyer, 13.05.09
Post on 06-Apr-2015
124 Views
Preview:
TRANSCRIPT
Grundkonzepte der Grundkonzepte der objektorientierten Programmierung objektorientierten Programmierung
mit Delphimit 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
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
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)
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
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).
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:
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?
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()).
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:
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
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;
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
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
Entwicklung der GUIEntwicklung der GUI15
OO-Entwurf
OOD-Klassendiagramm
Prototyp
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
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
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.
Uhr mit EreignisUhr mit Ereignis
Helmut Paulus Speyer, 13.5.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
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
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!
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)
Uhr mit TimerUhr mit Timer
Helmut Paulus Speyer, 13.5.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
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.
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
Vererbung - SpezialisierungVererbung - Spezialisierung
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.
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!
Ü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.
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!
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.
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.
Vererbung - GeneralisierungVererbung - Generalisierung
Helmut Paulus Speyer, 13.5.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
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
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.
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;
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
KlassendiagrammKlassendiagramm41
42 AufgabenAufgaben
1. Testen Sie das Programm ‚Konten’ und vervollständigen Sie die Auszahlungsmethoden.
Anhang 1Anhang 1
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
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.
Delphis Klassenbibliothek (Auszug)Delphis Klassenbibliothek (Auszug)46
Anhang 2Anhang 2GrundkonzepteGrundkonzepte
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)
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
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.
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
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
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.
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
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)
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.
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.
Anhang 3Anhang 3Phasen der Phasen der SoftwareentwicklungSoftwareentwicklung
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
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
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
Anhang 3Anhang 3KursarbeitKursarbeit
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.
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()
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.
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
Kursarbeit 2Kursarbeit 267
Klassendiagramm
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
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
top related