![]() |
Re: [OOP]: sinnvolle Vererbung
Vielen Danke für die Posts! :-D
Bedanke mich bei (alphabetisch):
Zitat:
Danke |
Re: [OOP]: sinnvolle Vererbung
Zitat:
Du hast die Klasse TMyList mit Wurzel als TKnoten vorgegeben und kannst oder darfst sie nicht mehr im Design verändern. Du möchtest davon eine Klasse ableiten, die aber Knoten als TNewKnoten implementiert. |
Re: [OOP]: sinnvolle Vererbung
Zitat:
Ich hoffe es sich verständlich. :? |
Re: [OOP]: sinnvolle Vererbung
Ich hab dir mal ein kleines Beispiel zusammengebastelt:
Delphi-Quellcode:
Somit hast du dann eigentlich zwei Objekte (beide jeweils private und somit gekapselt und nur über properties ansprechbar!), wobei das zweite die ererbten Methoden, Eigenschaften von dem gelinkten Objekt verwendet. Sommit kannst du Wurzel in TMyNewList verändern und dann eine aus TMyList ererbte Funktion aufrufen, die irgendwas mit Wurzel macht. Anschließend kannst du die veränderten Werte von Wurzel in TMyNewList wieder abrufen.
{...}
type TKnoten = class FZahl: Integer; public property Zahl: Integer read FZahl write FZahl; end; TMyList = class FWurzel: TKnoten; public constructor Create; destructor Destroy; override; function Verdopple: Integer; property Wurzel: TKnoten read FWurzel write FWurzel; end; // WICHTIG: Jeder Zugriff auf ererbte Eigenschaften muss über das LinkedObject laufen TNewKnoten = class(TKnoten) FText: string; FLinkedObject: TKnoten; private function GetZahl: Integer; procedure SetZahl(const Value: Integer); public constructor Create(LinkedObject: TKnoten = nil); destructor Destroy; override; property Text: string read FText write FText; property Zahl: Integer read GetZahl write SetZahl; end; TMyNewList = class(TMyList) FWurzel: TNewKnoten; public constructor Create; destructor Destroy; override; property Wurzel: TNewKnoten read FWurzel write FWurzel; end; {...} implementation { TMyList } constructor TMyList.Create; begin FWurzel := TKnoten.Create; end; destructor TMyList.Destroy; begin FreeAndNil(FWurzel); inherited; end; function TMyList.Verdopple: Integer; begin Result := FWurzel.Zahl * 2; end; { TNewKnoten } constructor TNewKnoten.Create(LinkedObject: TKnoten = nil); begin FLinkedObject := LinkedObject; end; destructor TNewKnoten.Destroy; begin FLinkedObject := nil; end; function TNewKnoten.GetZahl: Integer; begin if Assigned(FLinkedObject) then Result := FLinkedObject.Zahl else Result := FZahl; end; procedure TNewKnoten.SetZahl(const Value: Integer); begin if Assigned(FLinkedObject) then FLinkedObject.Zahl := Value else FZahl := Value; end; { TMyNewList } constructor TMyNewList.Create; begin inherited; FWurzel := TNewKnoten.Create(TMyList(Self).Wurzel); end; destructor TMyNewList.Destroy; begin FreeAndNil(FWurzel); inherited; end; {...} |
Re: [OOP]: sinnvolle Vererbung
Danke, Stevie! :-D
Phoenix hat mir folgende PN geschickt: Zitat:
|
Re: [OOP]: sinnvolle Vererbung
Klar, wenn man beide Klassen neu erstellt, ist das der beste Weg.
Allerdings geht das eben nicht, wenn man eine schon bestehende Klasse hat, die man erweitern will. |
Re: [OOP]: sinnvolle Vererbung
Ich danke allen Postern, für die vielen Antworten. Danke :-D
In meinem Falls werde ich Klassenreferenztypen (class of) verwenden, aber auch der Vorschlag von Stevie werd ich mir merken. TCollection und TCollectionItem sind ideale Beispiele für Klassenreferenztypen (Phoenix). Hier noch ein alter Thread, bezüglich "class of": ![]() Der Thread ist [erledigt], Danke :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 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 by Thomas Breitkreuz