![]() |
Darf man Felder und Property's überschreiben?
Hi,
ein Thread zieht den nächsten nach sich: Das Problem - siehe meine letzte Diskussion:
Delphi-Quellcode:
type
tmyobj1=class(tobject) A:integer; end; tmyobj2=class(tmyobj1) B:string; end; TMyList1withtmyobj1 = class(TobjectList) procedure verarbeiteA; end; TMyList2withmyobj2 = class(TMyList1withtmyobj1) procedure verarbeiteAundB; end; tmyrich1=class(trichedit) private FMylist:TMyList1withtmyobj1 public property mylist: :TMyList1withtmyobj1 read FMylist write FMylist; constructor Create(aOwner:tcomponent); override;//mylist erzeugt end; type tmyrich2=class(tmyrich1) private FMylist:TMyList2withtmyobj2; public property mylist: :TMyList2withtmyobj2 read FMylist write FMylist; constructor Create(aOwner:tcomponent); override;//mylist löschen und erzeugen end; constructor tmyrich1.Create; begin inherited; FMylist:=TMyList1withtmyobj1.create; end; constructor tmyrich2.Create; begin inherited; inherited Mylist.free; FMylist:=TMyList2withtmyobj2.create; end; Zu wem gehören meine zweimal definierten Felder fmylist? Schreibe ich constructor tmyrich2.Create nicht, ist in tmyrich2, da .create von tmyrich1 genutzt wird, fmylist= nil. Nutze ich constructor tmyrich2.Create und erzeuge die Liste nochmal, greifen auch Routinen aus Tmyrich1 ordnubngsgemäß auf Feld fmylist respektive property mylist zu. Darf man so arbeiten? Gruß Uwe |
AW: Darf man Felder und Property's überschreiben?
Zitat:
Zitat:
Bei deinen Beispielbezeichnern kommt jetzt nicht so raus, dass da tatsächlich eine "ABC ist ein XYZ"-Beziehung besteht wenn du ableitest. |
AW: Darf man Felder und Property's überschreiben?
Und was passiert, wenn du ein tmyrich2 in ein tmyrich1 castest, bzw. in einer entsprechenden Variablen speichert. Ist dann nicht auch wieder mylist=nil, diesmal die von tmyrich1???
|
AW: Darf man Felder und Property's überschreiben?
Felder kann man sowieso nicht überschreiben.
In diesem Fall entstehen 2 Felder, welche zufällig den selben Namen besitzen, aber sonst haben die nichts gemeinsam. tmyrich2 besitzt also unabhängige 2 Listen und daran ändert auch ein Casten nichts mehr. Property kann man auch nicht überschreiben, aber man kann sie verdecken, erweitern oder verschieben.
Delphi-Quellcode:
in einen anderen Sichbarkeitsbereich geschrieben, verschiebt die Sichtbarkeit und dessen Nachfahren.
property Xyz;
(in einen Vorfahrentypen gekastet ergibt sich aber wieder die alte sichtbarkeit, weswegen man die Sichbarkeit eigentlich nicht wieder verringern kann/sollte) z.B.
Delphi-Quellcode:
oder
property Xyz stored False;
Delphi-Quellcode:
verändert ein paar Eigenschaften, welche von den Streamingklassen verwendet werden.
property Xyz default True;
Und dann das Verdecken: Wenn es im Vorfahren schon ein Property Xyz gibt und man es neu "erstell"
Delphi-Quellcode:
, dann ist in der Klasse und den Nachfahren die neue Deklaration sichbar und die Alte nicht.
property Xyz: TXyz2 read FXyz write SetXyz;
(auch hier, wenn man über eine Vorfahrenklasse drauf zugreift, dann kommt man wieder an das alte Property ran und vom Neuen ist nix mehr zu merken) Soll die Funktion "definitiv" verändert werden, dann benötigt man einen überschreibbaren Getter/Setter, für dieses Property. |
AW: Darf man Felder und Property's überschreiben?
Hi,
das mein Konstrukt überhaupt funktionierte, lag hieran:
Delphi-Quellcode:
Diese Liste wird zwar gelöscht, ihr Speicher scheint aber noch ein bißchen erhalten zu bleiben.
constructor tmyrich2.Create;
begin inherited; {->>>} inherited Mylist.free; FMylist:=TMyList2withtmyobj2.create; end;
Delphi-Quellcode:
führt zum Griff ins nirwana-nil, wenn der Vorgänger auf "seine" Liste zugreifen will.
constructor tmyrich2.Create;
begin inherited; inherited Mylist.free; {->>>} inherited MyList:=nil; FMylist:=TMyList2withtmyobj2.create; end; @Himitsu hat recht, es sind verschiedene Eigenschaften resp. Property's, auf die jeweils in ihrem Gültikeitsbereich zugegriffen wird. Damit muß ich meine Vorstellung, abgeleitete Listen in abgeleiteten Objekten ersetzen zu können, vergessen. War 'ne Optimierungs-Vorstellung, nicht alles zweimal erfinden zu müssen. Danke und Grüße Uwe |
AW: Darf man Felder und Property's überschreiben?
Mir ist noch nicht so ganz klar, was eigentlich erreicht werden soll, aber vieleicht so als Anregung:
Delphi-Quellcode:
type
TMyObj1 = class(TObject) A:integer; end; TMyObj2 = class(TMyObj1) B:string; end; TMyList = class(TObjectList) procedure verarbeite; virtual; abstract; end; TMyList1 = class(TMyList) procedure verarbeite; override; {verarbeitet tmyobj1} end; TMyList2 = class(TMyList) {oder class(TMyList1)} procedure verarbeite; override; {verarbeitet tmyobj2} end; TMyRich = class(TRichEdit) private FMylist: TMyList; function GetMyList: TMyList; protected function CreateList: TMyList; virtual; abstract; public property mylist: TMyList read GetMyList; destructor Destroy; override; end; TMyRich1 = class(TMyRich) protected function CreateList: TMyList; override; end; TMyRich2 = class(TMyRich) protected function CreateList: TMyList; override; end; implementation destructor TMyRich.Destroy; begin FMylist.Free; inherited; end; function TMyRich.GetMyList: TMyList; begin if FMylist = nil then FMylist := CreateList; Result := FMylist; end; function TMyRich1.CreateList: TMyList; begin Result := TMyList1.Create; end; function TMyRich2.CreateList: TMyList; begin Result := TMyList2.Create; end; |
AW: Darf man Felder und Property's überschreiben?
Hi,
@Blup: Es sollen Funktionen und Proceduren der ersten auch in der zweiten Liste genutzt werden können, ebenso wie in den Objecten (z.b. trichedit), wo die Nachkommen erst auf Felder von der zweiten Liste zugreifen wollen. Ich muß mir Deinen Eintrag nochmal langsam durchlesen. Hier noch 'ne Idee:
Delphi-Quellcode:
Falls diese Gleichsetzung von der Vorgängerliste mit der Nachfolgerliste eine Gleichsetzung der Pointer und nicht etwa ein Kopieren des Inhaltes bewirkt, ist das vielleicht eine Lösung.
constructor tmyrich2.Create;
begin inherited; inherited Mylist.free; inherited MyList:=nil; FMylist:=TMyList2withtmyobj2.create; {--->} inherited mylist:= fMylist end; Zumindestens funktioniert jetzt das Programm. Das kommt mir wie ein Casting der Listentypen vor. Im tmyrich1 wird FMylist als TMyList1withtmyobj1 interpretiert und im tmyrich2 wird FMylist als TMyList2withtmyobj2 genutzt wie geplant. Güße Uwe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 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