![]() |
Interfaces in Delphi
Hallo,
ich experimentiere zur Zeit mit der Implementation von Schnittstellen unter Delphi. Hier laufen offensichtlich Dinge im Hintergrund ab, die ich nicht verstehe. Ein Beispiel:
Delphi-Quellcode:
Nach meinem Verständnis sollte es in der Zeile, in der auf MyImpl2 zugegriffen wird, eine saftige Schutzverletzung geben. Es wird ja schließlich nirgendwo eine Instanz erzeugt. Dem ist aber nicht so (Delphi 7 Prof).
IMyInterface = interface(IInterface)
['{EAB5845A-EB98-4BA4-A36A-CC7092973EA6}'] function GetString : string; end; TMyImpl = class(TInterfacedObject, IMyInterface) public function GetString : string; end; TMyImpl2 = class(TInterfacedObject, IMyInterface) private function PrivateString : string; public function GetString : string; end; { TMyImpl } function TMyImpl.GetString: string; begin Result := 'MyImpl'; end; { TMyImpl2 } function TMyImpl2.PrivateString: string; begin Result := ' MyImpl2.PrivateString'; end; function TMyImpl2.GetString: string; begin Result := 'MyImpl2' + PrivateString; end; // Testmethode procedure TForm1.Button1Click(Sender: TObject); var MyImpl2 : TMyImpl2; IMyIntf : IMyInterface; begin IMyIntf := TMyImpl.Create; Label1.Caption := IMyIntf.GetString + ' ' + MyImpl2.GetString; end; Hat jemand eine Erklärung hierfür? |
Re: Interfaces in Delphi
Das hat nix mit den Interfaces zu. Du greifst auf eine statische Methode zu. Also gar kein Zugriff auf irgendwelche Instanzenfelder.
EDIT: Und du machst es ja nicht mal per Interface ;-) Du greifst direkt auf die (nicht vorhandene) Instanz zu. (Da gibts auch Leute, die nen Sport draus machen, Delphi für sowas zu missbrauchen - denn "es knallt ja nicht, und zwar solange, bis...", ja solange, bis virtuelle Moethoden ins Spiel kommen bzw. Instanzenvariablen) |
Re: Interfaces in Delphi
Statische Methode? Ich hätte gedacht, dass der Zugriff ohne Instanziierung nicht funktionieren dürfte.
Es ist ja keine class function. Entferne ich die Erstellung der Schnittstelle (Zeile davor) erhalte ich auch korrekterweise eine Schutzverletzung. Also hat es doch etwas mit dem Interface zu tun - oder? |
Re: Interfaces in Delphi
Es geht mir nicht darum Delphi zu vergewaltigen - ich will nur gern wissen was hinter den Kulissen passiert.
|
Re: Interfaces in Delphi
Solange eine Methode keine Felder einer Klasse benötigt oder virtuell ist (und damit erst berechnet werden muss, welche Implementation der Methode angesprungen werden soll) verhalten sich die Methoden wie normale globale Prozedure/Funktionen. Der Methode wird dann zwar ein ungültiger Self-Zeiger übergeben (intern sehen Methoden etwa so aus: "method {TClass.}Foo(Self: TClass; [Parameter])"). Das alles geht so lange gut, bis Felder ("Self.Feld") oder virtuelle Funktionen ("Self.CallVirtual(TClass.Method)") benutzt werden.
|
Re: Interfaces in Delphi
Ok - danke. Das stimmt, sobald Felder oder virtuelle Methoden im Spiel sind, gibt es die Schutzverletzung.
Dann hat mich die Interface-Zeile nur auf eine falsche Fährte gelockt. |
Re: Interfaces in Delphi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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 by Thomas Breitkreuz