![]() |
Delphi-Version: XE5
$M+, IInvokable, RTTI - Wozu?
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist vielleicht etwas viel Text. Das liegt daran, dass ich die ganze Thematik irgendwie nicht verstehe.
Letzten Dienstag bei Embarcadero's Skill Sprint-Folge zu "AOP mit DSharp" von Nick Hodges (Aufzeichnung ist leider noch nicht hochgeladen) kam überall dieses komische
Delphi-Quellcode:
-Interface vor.
IInvokable
Auf die Frage, was das soll konnte mir der gute Herr Hodges keine konkrete Antwort geben. Nur dass es DSharp hier brauchen würde. Andere Frameworks wie Delphi Mocks würden sich angeblich ebenso verhalten. Aus diesem Grund würde er sogar empfehlen, Interfaces grundsätzlich allesamt von
Delphi-Quellcode:
statt
IInvokable
Delphi-Quellcode:
abzuleiten.
IInterface
Nun gut- Zum ersten mal schaue ich, was
Delphi-Quellcode:
überhaupt ist.
System.IInvokable
Dem Source nach nichts weiter als
Delphi-Quellcode:
. Der Hilfe-Artikel
{$M+}IInvokable = interface(IInterface) end; {$M-}
![]() Zitat:
Deswegen sieht es für mich bislang so aus: Es gibt irgendwelche Mechanismen die noch auf die "alte" RTTI aufbauen. Diese Mechanismen brauchen eine explizite Generation dieser RTTI-Informationen für Typen mit denen sie arbeiten sollen. Und diese Mechanismen stecken wohl in DSharp und anderswo. Richtig soweit? Wenn es wirklich so einfach war:
|
AW: $M+, IInvokable, RTTI - Wozu?
Ob "alte" oder "neue" RTTI ist unerheblich, wenn man die Metadaten explizit unterdrückt, dann legt man auch die neue RTTI still.
In den Projekt-Optionen kannst Du dies global für Dein Projekt einstellen, im englischen Delphi heißt diese Option "Emit run-time type information". Die Standard-Typen erfordern hier keine weitere Behandlung, diese verfügen bereits über die Metadaten - u.a. deswegen werden EXEn ja stets eine Handbreit größer. Ich empfinde die Aussage von Nick pauschal immer von IInvokable ableiten zu sollen, als zu kurz gegriffen. Oder einfach als falsch. Genau dann, wenn man die Metadaten braucht, mag es richtig und das Mittel der Wahl sein - wenn man die Metadaten nicht benötigt, ist es überflüssig. Und nur auf den Verdacht hin, dass man später irgendwann mal was in der Richtung benötigen könnte, würde ich meine Klassen- bzw. Interface-Architektur nicht designen wollen. |
AW: $M+, IInvokable, RTTI - Wozu?
Liste der Anhänge anzeigen (Anzahl: 1)
Gesetzt mit dem Bild im Anhang habe ich den richtigen Compilerschalter erwischt- Warum bekomme ich, egal ob an oder aus, zur Laufzeit eine
Code:
Code lasse ich weg, ich will einfach nur ein
EInvalidOpException: 'The type parameter "TProc" contains no RTTI. Please check for {$M+}.'
Delphi-Quellcode:
anlegen.
Spring.Event<TProc>
Ich dachte, mit diesem Schalter hätte der Typ "TProc" dann die RTTI-Informationen? Oder ist TProc hier eine Ausnahme? |
AW: $M+, IInvokable, RTTI - Wozu?
Zitat:
Allerdings gibt es 2 verschiedene Wege, an diese Information zu gelangen: 1. Pointergefummel mit dem Krams aus TypInfo und Wissen, wie sie z.b. ![]() 2. System.Rtti.pas mit einer higher level API aka "neue" RTTI - greift aber letztlich auf dieselben durch den Compiler generierten Informationen zu. Zitat:
Zu TProc und Co aus der SysUtils, kannst du keine RTTI hinzufügen, du musst dann deine eigenen Typen deklarieren. (*) Für den von dir kompilierten Source funktioniert der von Daniel erwähnte Schalter. Allerdings beeinflusst der nicht die in der RTL/VCL/... enthaltenen Typen. Außerdem macht auf diese Option vertrauen anstatt das explizit in den eigenen Typen anzuschalten mehr Ärger als Nutzen. |
AW: $M+, IInvokable, RTTI - Wozu?
Zitat:
|
AW: $M+, IInvokable, RTTI - Wozu?
Das
Delphi-Quellcode:
gibt an, daß die Standardsichtbarkeit der Property in den nachfolgenden Klassen von Public auf Published gelegt wird.
{$M+}
Somit können die Streaming-/Zugriffscodes also immer diese Property finden/auflisten. Das betrifft nicht nur IInvokable, sondern auch TPersistent/TComponent, was vorallem von der VCL verwendet wird. Also in dieser Klasse und deren Nachfahren werden Property standardmäßig published gemacht, wenn man davor keine explizite Sichbarkeit (private/publich/...) angibt. Published-Property landen immer in der RTTI (egal ob Alte oder neue/erweiterte RTTI), selbst wenn man alles Mögliche von der RTTI deaktivierten würde. |
AW: $M+, IInvokable, RTTI - Wozu?
Zitat:
Delphi-Quellcode:
hat da schon was, nur muss das entsprechende Interface sich von
TVirtualInterface.Create(..)
Delphi-Quellcode:
ableiten (oder halt die TypInfos mit Compiler-Direktiven erhalten).
IInvokable
Heißt: Für Bibliothekscode generell von
Delphi-Quellcode:
ableiten? Mir ist das Interface auch in den letzten vier Jahren nie über den Weg gelaufen, deshalb tue ich mich da so schwer mit.
IInvokable
Gibt es noch mehr Meinungen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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