![]() |
"Fehler" bei Überschreiben von Properties
Morgen.
Ich habe gerade eine recht... seltsame Entdeckung bei der Überschreibung von Properties gemacht. Es sieht so aus, als würde der Compiler sich gar nicht erst überlegen, ob er die Property der Oberklasse oder die der Unterklasse nimmt. Ich kann das Vorgehen des Compilers zwar verstehen, aber eigentlich müsste er doch bei einer Situation wie der in meinem Testprojekt einen eigenen Eintrag in der VMT anlegen und dann da nachschauen... :gruebel: Folgende Klassen:
Delphi-Quellcode:
Jetzt folgender Code:
type
TA=class protected FFoo: Integer; public property Foo: Integer read FFoo write FFoo; end; TB=class(TA) public procedure SetFoo(AFoo: Integer); property Foo: Integer read FFoo write SetFoo; end; implementation procedure TB.SetFoo(AFoo: Integer); begin FFoo:=AFoo; showmessage('Wuppdi'); end;
Delphi-Quellcode:
Es kommt wie erwartet die Messagebox. Kleine Änderung:
var a: TB;
begin a:=TB.Create; a.Foo:=42; end;
Delphi-Quellcode:
Keine Messagebox. Der Compiler beschreibt einfach FFoo und ruft SetFoo nicht auf.
var a: TA;
begin a:=TB.Create; a.Foo:=42; end; Mich würde auch interessieren, ob sich das bei neueren Delphiversionen reproduzieren lässt. |
Re: "Fehler" bei Überschreiben von Properties
Du hast zwar ne Instanz von TB erzeugt, diese wird aber einer Referenzvariable für TA zuhewiesen, deshalb wird auch die Implementierung von TA verwendet.
|
Re: "Fehler" bei Überschreiben von Properties
Hallo Manuel,
VMT = Virtual Method Table :wink: Wo hast du eine virtuelle Methode? Gruß Hawkeye |
Re: "Fehler" bei Überschreiben von Properties
Das ist es ja: Die soll der Compiler implizit anlegen. Sinngemäß würde ich sagen: Wenn ich die Property in der Unterklasse überschreibe und eine Instanz dieser Unterklasse habe, dann soll der Compiler auch die überschriebene Property aufrufen.
|
Re: "Fehler" bei Überschreiben von Properties
Die Variable ist aber vom Typ der Oberklasse.
|
Re: "Fehler" bei Überschreiben von Properties
Ja, aber die Instanz ist eine Instanz der Unterklasse. Nur der Instanzenpointer ist halt als Pointer auf die Instanz der Oberklasse deklariert.
Für mich ist es leicht sinnlos, wenn TB(a).Foo:=42; ein anderes Ergebnis bringt als a.Foo:=42. EDIT: Mir ist klar, dass das kein Bug ist, sondern "as designed", aber ich halte das trotzdem für nicht OOP-konzeptgemäß. |
Re: "Fehler" bei Überschreiben von Properties
Zitat:
Einfach aus dem Grund, weil ansonsten zur Compile-Time nicht entschieden werden kann, welche Methode ausgefuehrt werden soll. greetz Mike |
Re: "Fehler" bei Überschreiben von Properties
Das ist mir klar. Deswegen sagte ich ja auch, der Compiler soll in diesem Fall einen VMT-Eintrag anlegen, damit er es weiß.
|
Re: "Fehler" bei Überschreiben von Properties
Zitat:
Case closed. ;) |
Re: "Fehler" bei Überschreiben von Properties
Klar. Aber Delphi kennt virtuelle Methoden, also könnte der Compiler einen virtuellen Setter anlegen anstatt das "write FFoo" wörtlich zu nehmen. Ich habe jedenfalls relativ lange gebraucht, um diesen Fehler zu finden, vor allem deshalb, weil ich an der falschen Stelle gesucht habe. Ich habe mir gedacht "ich habe hier die Property überschrieben, also passt das" und habe Hunderte andere Codezeilen und Tutorials und Beispielunits durchwühlt.
Naja, ich glaube in Zukunft deklariere ich immer Settermethoden für Properties, die überschrieben werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 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