32
Vererbung Vererbung Modellierung grafischer Objekte Helmut Paulus Speyer, 5.- 7.11.07

Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

Embed Size (px)

Citation preview

Page 1: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

VererbungVererbung

Modellierung grafischer Objekte

Helmut Paulus Speyer, 5.-7.11.07

Page 2: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

2 AnwendungsbeispielAnwendungsbeispiel

Aktivitäten: verschieben, drehen, skalieren, editieren

Page 3: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

3 AnforderungenAnforderungen

• Erzeugung und Verwaltung von grafischen Objekten unter-schiedlicher Form

• Fähigkeiten der Objekte- frei verschiebbar (Maus)- skalierbar- drehbar

Page 4: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

4 Erste OOA-AnalyseErste OOA-Analyse

Problem: Vielfalt der Objekte

Optimierung: Entwicklung einer Klassenhierarchie

TKreis

TRechteck

TParallel

TQuadrat

TDreieck

TText

...

Page 5: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

5 KlassenhierarchieKlassenhierarchie

TGrafikElement

TKreis TPolygon TTextTLinie

TRegNEck

TRechteck

TParallel

Page 6: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

6 KlassenhierarchieKlassenhierarchie

Optimierung der Klassen durch Entwicklung einer Vererbungsstruktur

Ziele:

• Der gemeinsame Kern aller Elemente wird in einer Basisklasse modelliert.

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

Page 7: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

7 KlassenhierarchieKlassenhierarchie

Vorteile:

Durch Vererbung werden alle gemeinsamen Eigenschaften und Operationen an abgeleitete Klassen weitergegeben:

Grundlegende Attribute und Operationen werden nur einmal entwickelt

Möglichkeit zur Anpassung und Erweiterung unter geringem Aufwand (Wiederverwendbarkeit)

Einheitlicher Zugriff auf verschiedene Objekttypen wird möglich(Polymorphismus)

Page 8: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

8 Einfaches BeispielEinfaches Beispiel

Kreise und Rechtecke

Page 9: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

9 Kreise und RechteckeKreise und Rechtecke

TKreis

xPos, yPos //Mittelpunkte

Farbe // Füllfarbe

Canvas //Zeichenflächenref.

markiert // Markierungsflag

Rad //Radius

CreatepaintMoveto // verschiebenskalieren //vergrößern

TRechteck

xPos, yPos //Mittelpunkte

Farbe // Füllfarbe

Canvas //Zeichenflächenref.

markiert // Markierungsflag

Breite, FLaenge

Create paintMoveto // verschiebenskalieren //vergrößern

Beide Klassen besitzen gleiche Attribute und Methoden gleicher Funktionalität.

Das Gemeinsame muss nicht mehrmals implementiert werden!

Page 10: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

10 Erste Modellierung der KlassenErste Modellierung der Klassen

TKreis

Rad //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.

TGrafikElement

xPos, yPos //Mittelpunkte

Farbe // Füllfarbe

Canvas //Zeichenflächenref.

Markiert // Markierungsflag

Create //BasiskonstruktorMoveto // verschieben

ist ein ist ein

Page 11: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

11 Implementierung der BasisklasseImplementierung der Basisklasse

TGrafikElement

- xPos : integer- yPos : integer

- Farbe : TColor

- markiert : boolean

- Canvas : TCanvas

+ Create(CanRef : TCanvas; x, y : integer)+ moveto(x, y : integer);

+ gibX : integer+ gibY : integer

TGrafikElement = class

private

xPos : integer;

yPos : integer;

Farbe : TColor;

markiert : boolean;

Canvas : TCanvas;

public

constructor create(CanRef : TCanvas; x,y : integer);

procedure moveto(x,y : integer);

function gibX : integer;

function gibY : integer;

gibFarbe Farbe : Tcolor;

procedure setzeFarbe(wert : TColor);

end;

Page 12: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

12 Implementierung der BasisklasseImplementierung der Basisklasse

constructor TGrafikElement.create(CanRef : TCanvas; x,y : integer);

begin

xPos := x;

yPos := y;

canvas := CanRef;

end;

TGrafikElement

- 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 TGrafikElement.moveto(x,y : integer);

begin

xPos := x;

yPos := y;

end;

Page 13: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

13 „„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.

TGrafikElement

...

...

TKreis

- rad : 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.

Page 14: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

14 Implementierung der Klasse „TKreis“Implementierung der Klasse „TKreis“

TKreis = class(TGrafikElement)

private

rad : 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;

TGrafikElement

...

...

TKreis

-rad : integer

-...

+ paint+ setAttribute( r : integer, f : TColor)+ gibRadius : ineger

+ setzeRadius(wert : integer)

ist ein

Page 15: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

15 Implementierung der Klasse „TKreis“Implementierung der Klasse „TKreis“

TGrafikElement

...

...

TKreis

- rad : integer

- setzeRadius(wert : integer)

+ paint+ setAttribute( r : integer, f : TColor)

ist ein

constructor TKreis.create(CanRef : TCanvas; x,y : integer);

begin

inherited create(CanRef,x,y); //Konstruktor der Oberklasse

FRad := 10;

end;

Durch Aufruf des geerbten Konstruktors werden die Attribute des Basisobjekts initialisiert.Das abgeleitete Objekt enthält quasi ein Basisobjekt als Teilobjekt.

Page 16: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

16 Implementierung der Klasse „TKreis“Implementierung der Klasse „TKreis“

TGrafikElement

...

...

TKreis

- Rad : integer

+ paint

+ setRadius(wert : integer)

+ setAttribute( r : integer, f : TColor)

ist ein

procedure TKreis.setAttribute(r : integer;f : TColor);

begin

Rad := r;

Farbe := f;

end;

procedure TKreis.paint;var x1,y1,x2,y2 : integer;

begin //umgebendes Rechteck x1 := xPos-Frad; y1 := yPos-Frad;

x2 := xPos+Frad;

y2 := yPos+Frad;

with canvas do begin brush.color:= FFarbe; ellipse(x1,y1,x2,y2); end;end;

Page 17: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

17 Vererbung und ZugriffrechteVererbung und Zugriffrechte

Schutzebenen:

publickeine Zugriffsbeschränkung nach außen

privateZugriff nur innerhalb einer Klasse

protectedZugriff 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.

Page 18: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

18 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 : TGrafikElement; ...

Kreis := TKreis.create(...); Rechteck := TRechteck.create(..);

...

Hinweis:

Grafik ist eine Referenz auf den Teil des Kreisobjekts, der von TGrafikElement geerbt wird.

Möglich:Grafik := Kreis; Grafik.setzeFarbe(clred);Grafik := Rechteck;

Nicht möglich: Grafik.setzeAttribute(...)Grafik.setzeBreite(100);

Page 19: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

19

is - Operator : Typprüfung (Laufzeit)

Beispiel:

Var

Figur : TGrafikElement;

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

Operatoren „is“ und „as“ Operatoren „is“ und „as“

as - Operator : Typumwandlung (Laufzeit)

Beispiel:

Kreis := Figur as TKreis;

(Figur as TKreis).paint;

- liefert eine Referenz auf ein Objekt vom Typ Kreis

Page 20: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

20 Statische MethodenStatische Methoden

Kreis.paint; //paint - Methode des Kreisobjekts

Rechteck.paint; //paint - Methode des

Rechteckobjekts

Der Typ der Referenz auf das Objekt bestimmt, welche Methode aufgerufen wird.

Die bisher definierten Methoden sind statisch:

Beim Compilieren ist der Objekttyp bekannt, sodass die Sprungadresse der Methode festgelegt werden kann (statische Bindung)

Problem:

Dieses Verhalten ist, wenn Vererbung ins Spiel kommt, oft unerwünscht. Z. B. wenn sich erst zur Laufzeit entscheidet, welcher Objekttyp angesprochen wird.

Page 21: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

21 Statische MethodenStatische Methoden

Beispiel:

Zur Laufzeit werden verschiedene Grafikobjekte erzeugt und ihre Referenzen in einem Array als Container verwaltet:

Var Figur : array[1..10] of GrafikElement;

Ziel: Einheitlicher Zugriff auf bestimmte Methoden, wie z. B.:

for i := 1 to 10 do Figur[i].paint;

Dazu müsste der aktuelle Objekttyp für die Auswahl der Methode maßgebend sein.

Da zur Compilierzeit noch nicht feststeht, welche Objekttypen ins Array aufgenommen werden, entscheidet sich erst zur Laufzeit, welche Objektmethode aufgerufen werden soll.

Page 22: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

22 Virtuelle MethodenVirtuelle Methoden

Die Basisklasse erhält ebenfalls eine Methode paint; diese wird aber als virtual deklariert.

TGrafikElement = class

private

...

public

...

procedure paint;virtual;

end;

TKreis =

class(TGrafikElement) private ... public procedure paint;override; ...end;

Lösung des Problems durch virtuelle Methoden:

paint wird in der Unterklasse überschrieben,

d.h. als override deklariert und neu

implementiert.

Page 23: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

23 Verhalten virtueller MethodenVerhalten virtueller Methoden

Var Figur : Array[1..10] of TGrafikElement;

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.

Interne Realisierung:

Objekte besitzen einen Zeiger auf eine virtuelle Methodentabelle (VMT), die Zeiger auf alle virtuellen Methoden der Klasse enthält.Bei virtuellen Methoden erfolgt der Aufruf über diese Methodenzeiger-Tabelle.

Dynamische Bindung / late binding

Page 24: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

24 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.

Page 25: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

25 Abstrakte KlassenAbstrakte Klassen

Die Basisklasse TGrafikElement 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.

TGrafikElement = class ...

procedure paint;virtual;abstract;...

end;

TGrafikElement als abstrakte

Klasse

Page 26: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

26 Aufgaben 1Aufgaben 1

1. Entwickeln Sie ein Programm, das mehrere grafische Objekte anzeigt.

2. Verwenden Sie die Unit uGrafEle.pas.

3. Ergänzen Sie die Objekte um die Funktion „gibFlaeche“. Der Zugriff soll polymorph erfolgen.

4. Entwickeln Sie eine abstakten Oberklasse für alle Listen.

5. Polymorphismus anwenden:Eine Bank verfügt über Girokonten und Sparkonten. Während Girokonten überzogen werden können, dürfen Sparkonten keinen negativen Stand aufweisen.Der Auszahlungsaufruf soll für beide Kontotypen einheitlich seinEntwickeln Sie eine geeignete Vererbungsstruktur (UML)

Page 27: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

27 AnhangAnhang

Objektverwaltung

Page 28: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

28 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 TGrafikElement (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

Page 29: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

29 KlassendiagrammKlassendiagramm

TGrafikElement

#F Markiert : boolean; #Farbe : TcolorxPos : integeryPos : integer

# zeichneMarke+ paint

TVerwalter

- Elemente : TList

+ Count : integer

+ add(Objekt : TGrafikElement)

+ getElement( index : integer);

+ getElementAt(x, y : integer) : TGrafikElement

+ entferne(Objekt : TGrafikElement)

+ paintAll

*

TGUI

SelObjekt : TGrafikElement

Verwalter : TVerwalter

FormCreate(...)FormPaint(...)

FormMouseDown(...)

FormMouseMove(...)

Der Verwalter hat ein Tlist-Objekt zur Aufnahme der Elemente

1

getElementAt(x,y)

- Element an der Position (x, y) der Zeichenfläche

Page 30: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

30 Problem: Objekt auswählen Problem: Objekt auswählen

function TVerwalter.getElementAt(x, y : integer): TGrafikElement;

var i, dx, dy : integer;

Obj : TGrafikElement;

begin

result := nil;

for i := 0 to Elemente.Count-1 do

begin

Obj := TGrafikElement(Elemente[i]);

dx := x-Obj.getx;

dy := y-Obj.gety;

if dx*dx + dy*dy < 100 then

result := Obj;

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:

Page 31: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

31 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

Page 32: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 5.-7.11.07

32 Aufgaben 4Aufgaben 4

Erweiterung des Programms SimpelObjekt

• Objektverwalter einbinden (Klasse TVerwalter (Unit: uVerwalter)

• 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