AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RTTI, Klassen Fields und Attribute

Ein Thema von Schwarz · begonnen am 19. Okt 2016 · letzter Beitrag vom 20. Okt 2016
Antwort Antwort
Schwarz

Registriert seit: 27. Jul 2016
4 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

RTTI, Klassen Fields und Attribute

  Alt 19. Okt 2016, 17:00
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;
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#2

AW: RTTI, Klassen Fields und Attribute

  Alt 19. Okt 2016, 17:51
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: RTTI, Klassen Fields und Attribute

  Alt 19. Okt 2016, 18:07
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Okt 2016 um 18:11 Uhr)
  Mit Zitat antworten Zitat
Schwarz

Registriert seit: 27. Jul 2016
4 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: RTTI, Klassen Fields und Attribute

  Alt 20. Okt 2016, 08:36
Danke euch.
Dachte es mir schon fast aber es hätte ja trotzdem irgendwie möglich sein können....
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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