![]() |
Re: [OOP]: sinnvolle Vererbung
Zitat:
|
Re: [OOP]: sinnvolle Vererbung
Hm..ok, ich versuchs.
Also, Polymorphie bedeutet, dass Du ein Attribut mit dem Typ Deiner Basis-Klasse anlegst, und dann - wenn Du das Objekt letztendlich mit .Create erzeugst - nichtmehr die Basis-Klasse erstellst, sondern eine davon abgeleitete Klasse. Hier das ganze mal als Code:
Delphi-Quellcode:
Dann die Implementierung:
type
TBasisKlasse = class(TObject) public iErgebnis:integer; procedure Berechne(a,b:integer); end; TAddierenKlasse = class(TBasisKlasse) public procedure Berechne(a,b:integer); override; end; TSubtrahierenKlasse = class(TBasisKlasse) public procedure Berechne(a,b:integer); override; end;
Delphi-Quellcode:
Dadurch hast Du eine Basisklasse, und 2 davon abgeleitete Klassen, mit der gleichen Funktion. Beide funktionen machen etwas unterschiedliches. In der Funktion der Basisklasse steht nichts, da es sich um eine leere Dummy-Funktion handelt.
procedure TBasisKlasse.Berechne(a,b:integer);
begin // Dummy-Funktion end; procedure TAddierenKlasse .Berechne(a,b:integer); begin self.Ergebnis=a+b; end; procedure TSubtrahierenKlasse .Berechne(a,b:integer); begin self.Ergebnis=a-b; end; Im Deinem Programm dann:
Delphi-Quellcode:
Das mal zum Thema Polymorphie (ich hoffe, es ist soweit richtig @all :) ).
var
meinMatheObejkt:TBasisKlasse; function Addieren; begin meinMatheObjekt:=TAddierenKlasse.Create; meinMatheObjekt.Berechne(10,5); ShowMessage(IntToStr(meinMatheObjekt.Ergebnis)); // = 15 FreeAndNil(meinMatheObjekt); end; function Subtrahieren; begin meinMatheObjekt:=TSubtrahierenKlasse.Create; meinMatheObjekt.Berechne(10,5); ShowMessage(IntToStr(meinMatheObjekt.Ergebnis)); // = 5 FreeAndNil(meinMatheObjekt); end; Das würde in Deinem Konkreten Fall bedeuten, dass Du in Deiner TMyNewList-Klasse kein Attribut für einen Knoten einbinden musst, sondern das Attribut aus der Mutterklasse lassen kannst (TKnoten). Wenn Du nun die TKnoten-Klasse erweitern willst, dass z.B. im Kontruktor noch etwas mehr passiert, als in TKnoten, dann leitest Du dir von TKnoten eine neue Klasse ab (TNewKnoten). In den Methoden Deiner TMyNewListe kannst Du dann in Dein Wurzel-Attribut, welches Du aus der Mutterklasse hast und von Typ TKnoten ist, ein Objekt vom Typ TNewKnoten erzeugen. D.h, Du kannst zu Laufzeit entscheiden, welches Objekt letzten Endes in dem Attribut vorhanden ist. Hui, ganz schön viel stoff. Ich hoffe, es hilft dir. :-D Gruß Christian |
Re: [OOP]: sinnvolle Vererbung
Zitat:
P.S.: Ein virtual abstract in der abstrakten Klasse erspart dir das schreiben einer Dummy-Methode! ;-) |
Re: [OOP]: sinnvolle Vererbung
Zitat:
Delphi-Quellcode:
:-D
procedure Berechne(a,b:integer); virtual; abstract;
|
Re: [OOP]: sinnvolle Vererbung
Zitat:
Zitat:
|
Re: [OOP]: sinnvolle Vererbung
Sorry, wusste nicht, dass das Wurzel-Objekt schon erstellt ist.
|
Re: [OOP]: sinnvolle Vererbung
Zitat:
Das Wurzelobjekt wird doch bereits als abgeleitete Klasse erzeugt, damit kann die Mutter demnach auf alle Basismethoden wie gehabt darauf zugreifen. Beispiel:
Delphi-Quellcode:
TListe = class
wurzel: TItem; wurzelklasse: TItemClass; function Hinzufuegen: TItem; constructor Create(itemklasse: TItemClass); end; TItem = class end; TItemClass = Class of TItem; TMyItem = class end; TMyItemClass = class of TMyItem; constructor TListe.Create(itemklasse: TItemClass); begin wurzelklasse := itemklasse; end; function TListe.Hinzufuegen: TItem; begin result := wurzelklasse.Create; end; Nun kann man mit
Delphi-Quellcode:
alle beliebigen abgeleiteten Items direkt durch die Basisliste instanzieren lassen.
var
l_liste: TLIste; l_item: TItem; l_myItem: TMyItem; begin l_liste := TListe.Create(TItemClass); l_item := l_liste.Hinzufuegen; l_liste.Free; l_liste := TLIste.Create(TMyItemClass); l_myItem := l_liste.Hinzufzuegen as TMyItem; end; |
Re: [OOP]: sinnvolle Vererbung
Ja, sicher, ich bin aber davon ausgegangen, dass er von TMyList ableiten möchte ohne dass er dort irgendwas ändert und trotzdem auch das Wurzel-Objekt eine vom alten Wurzel-Objekt abgeleitete Klasse hat!
|
Re: [OOP]: sinnvolle Vererbung
Zitat:
// edit: OK. Ich verzeihe dir :mrgreen: |
Re: [OOP]: sinnvolle Vererbung
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz