33
Vererbung Vererbung Modellierung grafischer Objekte Helmut Paulus Speyer, 3.- 5.11.08

Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

Embed Size (px)

Citation preview

Page 1: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

VererbungVererbung

Modellierung grafischer Objekte

Helmut Paulus Speyer, 3.-5.11.08

Page 2: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 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

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

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.

Page 4: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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.

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

55 AnwendungsbeispielAnwendungsbeispiel

Aktivitäten: verschieben, drehen, skalieren, editieren

Page 6: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

66 Erste OOA-AnalyseErste OOA-Analyse

Problem: Vielfalt der Objekte

Optimierung: Entwicklung einer Klassenhierarchie

TKreis

TRechteck

TParallel

TQuadrat

TDreieck

TText

...

Page 7: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

77 KlassenhierarchieKlassenhierarchie

TGrafikObjekt

TKreis TPolygon TTextTLinie

TRegNEck

TRechteck

TParallel

Page 8: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

88 AnforderungenAnforderungen

• Erzeugung und Verwaltung von grafischen Objekten unter-schiedlicher Form

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

Page 9: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

99 Einfaches BeispielEinfaches Beispiel

Kreise und Rechtecke

Page 10: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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!

Page 11: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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

Page 12: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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;

Page 13: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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;

Page 14: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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

Page 15: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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.

Page 16: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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;

Page 17: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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.

Page 18: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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.

Page 19: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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);

Page 20: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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

Page 21: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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.

Page 22: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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;

Page 23: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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.

Page 24: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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

Page 25: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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.

Page 26: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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

Page 27: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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.

Page 28: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

2828 AnhangAnhang

Objektverwaltung

Page 29: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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

Page 30: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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

Page 31: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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:

Page 32: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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

Page 33: Vererbung Modellierung grafischer Objekte Helmut PaulusSpeyer, 3.-5.11.08

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