![]() |
RTTI, Klassen Fields und Attribute
Hallo,
ich habe in einer abgeleiteten Klasse ein protected Field "redeklariert" um das Attribut zu "überschreiben". Wenn ich dann per RTTI die Klassenfelder durchlaufe, wird mir dieses Field 2 mal angezeigt. Zuerst von TClassB und dann von TClassA. Gibt es eine Möglichkeit, dass es mir nur einmal ausgeben wird. Oder die Klasse mit RTTIType.GetFields nicht mit der Klassenhirachie sondern entgegen ausgegeben wird.
Delphi-Quellcode:
TClassA = class(TParentClass)
protected [TFieldDefs(32, 20)] FOBAuftraggeber: string; ... end; TClassB = class(TClassA) protected [TFieldDefs(22, 10)] FOBAuftraggeber: string; ... end; |
AW: RTTI, Klassen Fields und Attribute
Nein, es sind ja definitiv beide Felder in TClassB enthalten, die haben nur zufällig den selben Namen.
Das ursprüngliche Property wird nur verdeckt, es ist trotzdem noch vorhanden.
Delphi-Quellcode:
procedure SetzeAuftraggeberA(AItem: TClassA; const AValue: string);
begin AItem.OBAuftraggeber := AValue; end; procedure SetzeAuftraggeberB(AItem: TClassB; const AValue: string); begin AItem.OBAuftraggeber := AValue; end; var lItem: TClassB; sHinz, sKunz: string; begin lItem := TClassB.Create; SetzeAuftraggeberA(lItem, 'Hinz'); SetzeAuftraggeberB(lItem, 'Kunz'); sHinz := TClassA(lItem).OBAuftraggeber; sKunz := lItem.OBAuftraggeber; lItem.Free; ShowMessage(sHinz + '&' + sKunz); end; |
AW: RTTI, Klassen Fields und Attribute
Nur Property kann man redefinieren und/oder in ihrer Sichtbarkeit verschieben.
Alles andere sind komplett neue Deklarationen, egal, ob sie "zufällig" den selben Namen haben. Ausnahme bilden Methoden, wo man die neue Deklaration per "override" zurückverlinken kann, aber auch hier ist besonders gut erkenntlich, dass Beides existert, da man die Methode im Vorfahren per inherited immernoch aufrufen kann.
Delphi-Quellcode:
Man sieht, solange kein Typ angegeben wurde, wird vom alten Property geerbt.
type
TClassA = class(TParentClass) protected property OBAuftraggeber: string read ... write ...; end; TClassB = class(TClassA) public property OBAuftraggeber; // neue Sichtbarkeit (aber offiziell geht es nur "sichtbarer") // oder protected property OBAuftraggeber default '123'; // neuer Defaultwert (aber nur im Nachfahren) // oder property OBAuftraggeber write ...; // neuer Setter (aber nur im Nachfahren) // oder property OBAuftraggeber: string ...; // komplett neues Property, das nur zufällig gleich heißt end; |
AW: RTTI, Klassen Fields und Attribute
Danke euch.
Dachte es mir schon fast aber es hätte ja trotzdem irgendwie möglich sein können.... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 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