Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   RTTI Problem (https://www.delphipraxis.net/215010-rtti-problem.html)

Uwe Raabe 23. Apr 2024 11:17

AW: RTTI Problem
 
Wie ich schon schrieb halte ich den Ansatz, die über die Properties zu iterieren und diese jeweils zu kopieren, - wenn überhaupt mit vertretbarem Aufwand umsetzbar - für ziemlich aufwändig, fehleranfällig und schlecht wartbar. Immerhin muss bei jedem neuen Property geprüft werden, ob sich das so einfach kopieren lässt und das auch sachlich korrekt durchgeführt wird. Nicht immer enthalten die Properties Strings oder numerische Werte. Klasseninstanzen, Interfaces oder auch Arrays werden so nur als Referenzen und nicht inhaltlich kopiert. Das ist in der Regel bei Arrays und oft bei Klassen gar nicht gewollt. Solche Fälle müssten jeweils gesondert behandelt werden, was bei der RTTI-Lösung den Aufwand beträchtlich steigert.

Den empfohlenen Ansatz hat Frank schon mit TPersistent.Assign und seinem Pendant TPersistent.AssignTo angesprochen. Dieses Verfahren ist schon so alt wie Delphi, wird allgemein verstanden und hat sich bei korrekter Anwendung als stabil erwiesen.

Man kann sich die Implementierung in den simplen Fällen (Strings und numerische Werte) vereinfachen, wenn man die einzelnen Felder hinter den Properties einen record verlagert, der mit einfacher Zuweisung kopiert werden kann. Das deckt die ursprüngliche Absicht zur Vereinfachung der Wartbarkeit bereits ab. Da in dem beschriebenen Fall offenbar mit Interfaces gearbeitet wird, sind sowieso schon Getter und Setter vorhanden, die dann auf die Record-Felder umgeleitet werden. Eine mögliche Implementierung der TPersistent.Assign Ableitung sähe dann, unter der Annahme dass TProduct direkt von TPersistent abgeleitet ist, in etwa so aus:
Delphi-Quellcode:
procedure TProduct.Assign(Source: TPersistent);
begin
  if Source is TProduct then begin
    FData := TProduct(Source).FData;
  end
  else
    inherited;
end;
Bei dem Assign mit einem IProduct als Source wird es etwas komplexer und es bieten sich je nach Gegebenheiten mehrere Lösungsmöglichkeiten an:
  • Man erweitert IProduct um eine entsprechende Methode, die dann in allen Implementierungen entsprechend gefüllt werden muss.
  • Man deklariert ein separates Interface für das Assign, das man dan über Supports abfragt.
  • Wenn sichergestellt ist, dass alle Implementationen von IProduct auf TPersistent aufbauen:
    Delphi-Quellcode:
    Assign(Source as TPersistent);

himitsu 23. Apr 2024 11:18

AW: RTTI Problem
 
"beachten" muß der Compiler diese Interface-Property schon,
* denn man kann sie verwenden (wie bei normalen Property wird beim Auslesen/Zuweisen im Code einfach direkt gegen die Getter und Setter kompiliert)
* in den DCU müssen Infos für diese Property ebenfalls irgendwie enthalten sein, damit der PropertyName dann aufgelöst werden kann
* in BPL müssten sie auch drin stehen, damit nach Änderung auch der richtige Getter/Setter aufgerufen wird
:gruebel:

OK, unabhängig davon seht es in der TypeInfo des Interfaces definitiv nicht drin und scheinbar leider auch nicht in der Delphi-TypeInfo und RTTI.




Wenn es sich um Interfaces vom Delphi handelt, also mit einem TObjekt dahinter,
dann könnte man das Interface nach TObject casten und stattdessen über die RTTI des Objekts gehn.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Seite 2 von 2     12   

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