Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi RTTI, Klassen Fields und Attribute (https://www.delphipraxis.net/190599-rtti-klassen-fields-und-attribute.html)

Schwarz 19. Okt 2016 16:00

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;

Blup 19. Okt 2016 16:51

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;

himitsu 19. Okt 2016 17:07

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:
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;
Man sieht, solange kein Typ angegeben wurde, wird vom alten Property geerbt.

Schwarz 20. Okt 2016 07:36

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 08:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz