Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08.
-
Upload
agna-nenninger -
Category
Documents
-
view
103 -
download
0
Transcript of Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08.
VererbungVererbung
Modellierung grafischer Objekte
Helmut Paulus Speyer, 3.-5.11.08
2 Vererbung
erben Merkmale und Methoden der allgemeinen Klasse,
fügen Attribute oder Methoden hinzu oder
erweitern Methoden bzw. implementieren sie neu.
Mit Hilfe von Vererbungist es möglich, eine Klasse als Spezialfall einer allgemeineren Klasse zu definieren.
Die Objekte der spezialisierten Klasse
Vorteile:
Grundlegende Attribute und Operationen werden nur einmal entwickelt
Anpassung und Erweiterung unter geringem Aufwand (Wiederverwendbarkeit)
Einheitlicher Zugriff auf verschiedene Objekttypen wird möglich (Polymorphismus)
Klassenhierarchie
Optimierung von Klassen durch Entwicklung einer Vererbungsstruktur
3 Klassenhierarchie
• In der Klasse TObject wird das grundlegende Verhalten, das allen Objekten in Delphi gemeinsam ist, implementiert.
• TObject wird als direkte Basis für einfache Objekte verwendet. Wenn bei der Deklaration eines neuen Objekttyps kein Vorfahr angegeben wird, setzt Delphi als Vorfahr automatisch die Klasse TObject ein.
• Die Komponenten der Komponentenpalette sind alle Nachfahren der Klasse TComponent
Delphi’s Klassenhierarchie
Alle Objekte sind Nachfahren eines Urobjekts - Klasse TObject.
In TObject wird das grundlegende Verhalten, das allen Objekten in Delphi gemeinsam ist, realisiert.
4 Delphi‘s Klassenhierarchie (Auszug)
Klassen, die von TComponent abgeleitet sind, heißen Komponenten; viele davon stehen in der Komponentenpalette (VCL) der Entwicklungsumgebung zur Entwurfszeit zur Verfügung.
55 AnwendungsbeispielAnwendungsbeispiel
Aktivitäten: verschieben, drehen, skalieren, editieren
66 Erste OOA-AnalyseErste OOA-Analyse
Problem: Vielfalt der Objekte
Optimierung: Entwicklung einer Klassenhierarchie
TKreis
TRechteck
TParallel
TQuadrat
TDreieck
TText
...
77 KlassenhierarchieKlassenhierarchie
TGrafikObjekt
TKreis TPolygon TTextTLinie
TRegNEck
TRechteck
TParallel
88 AnforderungenAnforderungen
• Erzeugung und Verwaltung von grafischen Objekten unter-schiedlicher Form
• Fähigkeiten der Objekte- frei verschiebbar (Maus)- skalierbar- drehbar
99 Einfaches BeispielEinfaches Beispiel
Kreise und Rechtecke
1010 Kreise und RechteckeKreise und Rechtecke
TKreis
xPos, yPos //Mittelpunkte
Farbe // Füllfarbe
Canvas //Zeichenflächenref.
markiert // Markierungsflag
Radius
CreatepaintsetzePos // verschiebenskalieren //vergrößern
TRechteck
xPos, yPos //Mittelpunkte
Farbe // Füllfarbe
Canvas //Zeichenflächenref.
markiert // Markierungsflag
Breite, Laenge
Create paintsetzePos // verschiebenskalieren //vergrößern
Beide Klassen besitzen gleiche Attribute und Methoden gleicher Funktionalität.
Das Gemeinsame muss nicht mehrmals implementiert werden!
1111 Erste Modellierung der KlassenErste Modellierung der Klassen
TKreis
Radius
paintskalieren //vergrößern
TRechteck
Breite, Laenge
paint skalieren //vergrößern
Basisklasse
abgeleitete Klassen
(Unterklasse)
Generalisierung
Spezialisierung
Die Basisklasse enthält den gemeinsamen Kern aller grafischen Objektklassen.
TGrafikObjekt
xPos, yPos //Mittelpunkte
Farbe // Füllfarbe
Canvas //Zeichenflächenref.
Markiert // Markierungsflag
Create //BasiskonstruktorsetzePos // verschieben
ist ein ist ein
1212 Implementierung der BasisklasseImplementierung der Basisklasse
TGrafikObjekt
- xPos : integer
- yPos : integer
- Farbe : TColor
- markiert : boolean
- Canvas : TCanvas
+ Create(CanRef : TCanvas; x, y : integer)
+ setzePos(x, y : integer);
+ gibX : integer
+ gibY : integer
TGrafikObjekt = class
private
xPos : integer;
yPos : integer;
Farbe : TColor;
markiert : boolean;
Canvas : TCanvas;
public
constructor create(CanRef : TCanvas; x,y : integer);
procedure setePos(x,y : integer);
function gibX : integer;
function gibY : integer;
gibFarbe Farbe : Tcolor;
procedure setzeFarbe(wert : TColor);
end;
1313 Implementierung der BasisklasseImplementierung der Basisklasse
constructor TGrafikObjekt.create(CanRef : TCanvas; x,y : integer);
begin
xPos := x;
yPos := y;
canvas := CanRef;
end;
TGrafikObjekt
- xPos : integer- yPos : integer
- Farbe : TColor
- markiert : boolean
- Canvas : TCanvas
+ Create(CanRef : TCanvas; x, y : integer)
+ gibX : integer+ gibY : integer Die Objekte erhalten eine Referenz auf das
Zeichenflächenobjekt des GUI-Objekts
procedure TGrafikObjekt.setzePos(x, y : integer);
begin
xPos := x;
yPos := y;
end;
1414 Implementierung der Klasse „TKreis“Implementierung der Klasse „TKreis“
TKreis = class( TGrafikObjekt ) //Basisklasse
private
radius : integer;
public
constructor create(CanRef : TCanvas; x,y : integer);
procedure paint;
procedure setAttribute(r : integer; f : TColor);
function gibRadius : integer;
procedure setzeRadius(wert : integer);
end;
TGrafikObjekt
...
...
TKreis
-radius : integer
-...
+ paint+ setAttribute( r : integer, f : TColor)+ gibRadius : ineger
+ setzeRadius(wert : integer)
ist ein
1515 Implementierung der Klasse „TKreis“Implementierung der Klasse „TKreis“
TGrafikObjekt
...
...
TKreis
- radius : integer
+ paint
+ setzeRadius(wert : integer)
+ setAttribute( r : integer, f : TColor)
ist ein
constructor TKreis.create(CanRef : TCanvas; x,y : integer);
begin
inherited create(CanRef,x,y); //Konstruktor der Oberklasse
radius := 10;
end;
Durch Aufruf des geerbten Konstruktors werden die Attribute des Basisobjekts initialisiert.Das abgeleitete Objekt enthält quasi ein Basisobjekt als Teilobjekt.
1616 Implementierung der Klasse „TKreis“Implementierung der Klasse „TKreis“
TGrafikObjekt
...
...
TKreis
- Radius : integer
+ paint
+ setRadius(wert : integer)
+ setAttribute( r : integer, f : TColor)
ist ein
procedure TKreis.setAttribute(r : integer;f : TColor);
begin
radius := r;
Farbe := f;
end;
procedure TKreis.paint;var x1,y1,x2,y2 : integer;
begin //umgebendes Rechteck x1 := xPos-radius; y1 := yPos-radius;
x2 := xPos+radius;
y2 := yPos+radius;
with canvas do begin brush.color:= Farbe; ellipse(x1,y1,x2,y2); end;end;
1717 Vererbung und ZugriffsrechteVererbung und Zugriffsrechte
Schutzebenen:
public
keine Zugriffsbeschränkung nach außen
private
Zugriff nur innerhalb einer Klasse
protected
Zugriff auch in abgeleiteten Klassen möglich
Elemente einer Klasse können in der Klassendeklaration vor dem Zugriff von außen geschützt werden (Geheimnisprinzip).
Vererbung der Zugriffsrechte
Die Zugriffsrechte einer Klasse werden an abgeleitete Klassen vererbt.Schutzrechte können in einer abgeleiteten Klasse abgeschwächt, aber nicht verschärft werden.
Die Schutzebenen private und protected gelten allerdings nur für den Zugriff aus einer anderen Unit heraus.
1818 „„Ist ein“ - BeziehungIst ein“ - Beziehung
Die Unterklassen beschreiben nur die Abweichungen von von der Oberklasse. Alles andere kann wiederverwendet werden, weil es in der Oberklasse vorliegt.
Ein Objekt der Unterklasse hat somit ein Objekt der Oberklasse als Teilobjekt.
Umgekehrt sind alle Objekte der Unterklasse eine Teilmenge der Objekte der Oberklasse.
TGrafikObjekt
...
...
TKreis
- radius : integer
- setzeRadius(wert : integer)
+ paint+ setAttribute( r : integer, f : TColor)
ist ein
Jeder Kreis ist ein GrafikElement
Konsequenz: Zuweisungskompatibilität
Einer Variablen vom Typ der Oberklasse kann eine Referenz auf ein Unterklassenobjekt zugewiesen werden.
1919 ZuweisungskompatibilitätZuweisungskompatibilität
Konsequenz der „ist ein“ – Beziehung:
Einer Objektvariablen einer Oberklasse können Objekte aller
Unterklassen zugewiesen werden. Die Umkehrung gilt nicht.
Beispiel:
Var
Kreis : TKreis; Rechteck : TRechteck Grafik : TGrafikObjekt; ...
Kreis := TKreis.create(...); Rechteck := TRechteck.create(..);
...
Hinweis:
Grafik kann nur auf Methoden zugreifen, die in der Basisklasse deklariert sind.
Hinweis:
Grafik kann nur auf Methoden zugreifen, die in der Basisklasse deklariert sind.
Möglich:Grafik := Kreis; Grafik.setzeFarbe(clred);Grafik := Rechteck;
Nicht möglich: Grafik.setzeRadius(20)Grafik.setzeBreite(100);
2020
is - Operator : Typprüfung (Laufzeit)
Beispiel:
Var
Figur : TGrafikObjekt;
Kreis : TKreis; ...
if Figur is TKreis then
TKreis(Figur).paint; Typumwandlung (type cast)
- liefert true , wenn das Objekt Figur eine Instanz der angegebenen
Klasse oder eines ihrer abgeleiteten Klassen ist
TypumwandlungTypumwandlung
as - Operator : Typumwandlung (Laufzeit)
Beispiel:
Kreis := Figur as TKreis;
(Figur as TKreis).paint;
- liefert eine Referenz auf ein Objekt vom Typ Kreis
2121 Statische MethodenStatische Methoden
Kreis.paint; //paint-Methode des Kreisobjekts
Rechteck.paint; //paint-Methode des Rechteckobjekts
Der Klassentyp des Objekts bestimmt, welche Methode aufgerufen wird.
Statische Bindung:
• Beim Compilieren wird die Sprungadresse der Methode festgelegt; dazu muss
schon zu diesem Zeitpunkt der Objekttyp bekannt sein.
• Die bisher definierten Methoden sind statisch gebunden.
Problem:
Dieses Verhalten ist unerwünscht, wenn sich erst zur Laufzeit entscheidet,
welcher Objekttyp aktuell vorliegt.
2222 Statische MethodenStatische Methoden
Beispiel:
Zur Laufzeit werden verschiedene Grafikobjekte (Kreise, Rechtecke) erzeugt und in einem Array gespeichert:
Die Methoden müssen dynamisch gebunden werden!Die Methoden müssen dynamisch gebunden werden!
Da zur Compilierzeit noch nicht feststeht, welche Objekttypen an den einzelnen Stellen des Arrays gespeichert sind, kann erst zur Laufzeit festgestellt werden, welche Objektmethode aufgerufen werden muss.
Dazu müsste der aktuelle Objekttyp für die Auswahl der Methode maßgebend sein.
Var Figur : array[1..10] of GrafikElement;
Ziel: Einheitlicher Zugriff auf die paint-Methode
for i := 1 to 10 do Figur[i].paint;
Var Figur : array[1..10] of GrafikElement;
Ziel: Einheitlicher Zugriff auf die paint-Methode
for i := 1 to 10 do Figur[i].paint;
2323 Überschreiben von MethodenÜberschreiben von Methoden
paint wird in der Basisklasse als virtuelle Methode deklariert (virtual)
TGrafikObjekt = class
private
...
public
...
procedure paint;virtual;
end;
TKreis = class(TGrafikObjekt) private ... public procedure paint;override; ...end;
Dynamische Bindung:
paint wird in der Unterklasse
Überschrieben (override)
und neu implementiert.
Wirkung: Die neudefinierte Methode ersetzt nun die alte überall, d.h.
auch in ererbten Methoden, die die überschriebene Methode
verwenden.
Wirkung: Die neudefinierte Methode ersetzt nun die alte überall, d.h.
auch in ererbten Methoden, die die überschriebene Methode
verwenden.
2424 Verhalten virtueller MethodenVerhalten virtueller Methoden
Var Figur : Array[1..10] of GrafikElement;
Figur[5].paint; //Aufruf der virtuellen Methode
Die Referenz auf das Objekt enthält Information über den Typ des übergebenen Objekts. Dadurch kann die zum Objekt passende Methode aufgerufen werden.
Der Typ des aktuellen Objekts bestimmt zur Laufzeit die Methode.
Dynamische Bindung / late binding
2525 PolymorphismusPolymorphismus
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.
2626 Abstrakte KlassenAbstrakte Klassen
Die Basisklasse TGrafikObjekt muss die Methode paint enthalten, kann sie aber nicht sinnvoll implementieren, weil diese Klasse zu allgemein ist. Die Implementation kann also entfallen.Dazu wird die virtuelle Methode der Basisklasse zusätzlich als abstract deklariert.
Merkmale:
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.
TGrafikObjekt = class ...
procedure paint;virtual;abstract;...
end;
TGrafikObjekt als abstrakte
Klasse
2727 Aufgaben 1Aufgaben 1
1. Entwickeln Sie ein Programm, das mehrere grafische Objekte anzeigt.(Verwenden Sie die Units uGrafikObjekt.pas, uKreis.pas, uRechteck.pas.)
2. Ergänzen Sie die Objekte um die Funktion „gibFlaeche“. Der Zugriff soll polymorph erfolgen.
3. Ergänzen Sie die boolesche Funktion enthaelt(x, y : integer) , die prüft ein Punkt(x,y) innerhalb der Figur liegt. Der Zugriff soll polymorph erfolgen.
4. Ein Ball soll über den Bildschirm laufen. Entwickeln Sie die Klasse TBall. Nutzen Sie dabei Vererbung. Zur Animation kann ein Timer-Objekt (Klasse TTimer, s. Delphi-Hilfe) benutzt werden.
5. Eine Bank verfügt über Sparkonten, Girokonten und Festgeldkonten. Während Girokonten überzogen werden können, dürfen Sparkonten keinen negativen Stand aufweisen. Bei Festgeldkonten wird eine Strafgebühr fällig, wenn ein Betrag vor Ende der vereinbarten Laufzeit abgehoben wird.Der Auszahlungsaufruf soll für alle Kontotypen einheitlich sein.Entwickeln Sie eine geeignete Vererbungsstruktur (UML)
6. Entwickeln Sie eine abstrakten Oberklasse für alle Listen.
2828 AnhangAnhang
Objektverwaltung
2929 ObjektverwaltungObjektverwaltung
Aufgaben eines ObjektverwaltersReferenzen unterschiedlicher Objekttypen speichern
Einfügen, entfernen von Referenzen
Zugriff auf einzelne Objekte oder alle ermöglichen
Zeichnen aller Objekte
Realisierung Speicher (lineare Liste)
Array of TGrafikObjekt (dyn. Array) Lineare Liste entwickeln Vorhandene Container – Objekte nutzen oder anpassen
(TList) Methoden
Einfügen Entfernen Verschieben (innerhalb der Liste) Objekt an bestimmter Position ermitteln Zeichnen
3030 KlassendiagrammKlassendiagramm
TGrafikObjekt
#Markiert : boolean; #Farbe : TcolorxPos : integeryPos : integer
# zeichneMarke+ paint
TVerwalter
- objekt : array of TGrafikObjekt
+ gibAnzahl : integer;
+ fuegeEin(obj : TGrafikObjekt);
+ gibObjekt( index : integer);
+ gibObjektBei(x, y : integer) : TGrafikObjekt
+ entferne(Objekt : TGrafikObjekt)
*
TGUI
aktObjekt : TGrafikObjekt
vw : TVerwalter
FormCreate(...)FormPaint(...)
FormMouseDown(...)
FormMouseMove(...)
zeichneAlles
Der Verwalter hat ein dyn. Array zur Aufnahme der Elemente
1
gibObjektBei(x,y)
- Element an der Position (x, y) der Zeichenfläche
3131 Problem: Objekt auswählen Problem: Objekt auswählen
function TVerwalter.gibObjektAt(x, y : integer): TGrafikObjekt;
var i : integer;
begin
result := nil;
for i := 0 to High(Objekt) do begin if Objekt[i].enthaelt(x,y) then begin result := Objekt[i]; //tausche(i,letzt); end; end;end;
Liste der Objekte durchlaufen und Abstand zum übergebenen Punkt (x,y) berechnen
Abstandsbedingung prüfen
Referenz des letzten
gefundenen Objekts
zurückgeben
evtl. gefundenes Objekt ans
Ende der Liste setzen, damit
es als letztes gezeichnet wird
und damit alle anderen
überdeckt.
Objekt an der Stelle (x, y)
Algorithmus:
3232 ZusammenfassungZusammenfassung
1. Optimierung der Klassenstruktur
Verwaltungs - Klassen hinzufügen
Komplexe Klassen zerlegen
2. Optimierung der Attribute
3. Optimierung der Operationen
4. Optimierung der Vererbungsstruktur
Abstrakte Operationen für einheitliche Schnittstellen
Abstrakte Oberklassen bilden
Polymorphismus maximieren
Vererbungshierarchie komprimieren
Existierende Klassen wiederverwenden
OOD- Klassendiagramm
3333 Aufgaben 2Aufgaben 2
Erweiterung des Programms GraphObjekt
• Objektverwalter einbinden (Klasse TVerwalter (Unit: uGraphikObjekt)
• Objekte mit der Maus über den Bildschirm ziehen
• Farbe oder Größe einer mit Maus gewählten Figur ändern
• Mit Hilfe der Maus beliebig viele Objekte interaktiv erzeugen