Upload
haydn-ediger
View
104
Download
0
Embed Size (px)
Citation preview
VererbungVererbung
Modellierung grafischer Objekte
Helmut Paulus Speyer, 5.-7.11.07
2 AnwendungsbeispielAnwendungsbeispiel
Aktivitäten: verschieben, drehen, skalieren, editieren
3 AnforderungenAnforderungen
• Erzeugung und Verwaltung von grafischen Objekten unter-schiedlicher Form
• Fähigkeiten der Objekte- frei verschiebbar (Maus)- skalierbar- drehbar
4 Erste OOA-AnalyseErste OOA-Analyse
Problem: Vielfalt der Objekte
Optimierung: Entwicklung einer Klassenhierarchie
TKreis
TRechteck
TParallel
TQuadrat
TDreieck
TText
...
5 KlassenhierarchieKlassenhierarchie
TGrafikElement
TKreis TPolygon TTextTLinie
TRegNEck
TRechteck
TParallel
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.
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)
8 Einfaches BeispielEinfaches Beispiel
Kreise und Rechtecke
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!
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
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;
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;
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.
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
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.
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;
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.
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);
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
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.
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.
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.
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
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.
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
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)
27 AnhangAnhang
Objektverwaltung
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
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
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:
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
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