AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi "Fehler" bei Überschreiben von Properties

"Fehler" bei Überschreiben von Properties

Ein Thema von 3_of_8 · begonnen am 5. Feb 2007 · letzter Beitrag vom 6. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#1

"Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 22:28
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...

Folgende Klassen:
Delphi-Quellcode:
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;
Jetzt folgender Code:

Delphi-Quellcode:
var a: TB;
begin
  a:=TB.Create;
  a.Foo:=42;
end;
Es kommt wie erwartet die Messagebox. Kleine Änderung:

Delphi-Quellcode:
var a: TA;
begin
  a:=TB.Create;
  a.Foo:=42;
end;
Keine Messagebox. Der Compiler beschreibt einfach FFoo und ruft SetFoo nicht auf.

Mich würde auch interessieren, ob sich das bei neueren Delphiversionen reproduzieren lässt.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 22:41
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 22:49
Hallo Manuel,

VMT = Virtual Method Table

Wo hast du eine virtuelle Methode?

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 22:56
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 22:58
Die Variable ist aber vom Typ der Oberklasse.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 23:01
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äß.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#7

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 23:27
Zitat von 3_of_8:
ich halte das trotzdem für nicht OOP-konzeptgemäß.
Ist es aber. Alle Aufrufe von Members, welche keinen Eintrag in der VMT haben, werden von der Klasse aufgerufen, unter der die Variable deklariert, nicht instanziert wurde.
Einfach aus dem Grund, weil ansonsten zur Compile-Time nicht entschieden werden kann, welche Methode ausgefuehrt werden soll.

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 23:37
Das ist mir klar. Deswegen sagte ich ja auch, der Compiler soll in diesem Fall einen VMT-Eintrag anlegen, damit er es weiß.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 23:41
Zitat von 3_of_8:
Das ist mir klar. Deswegen sagte ich ja auch, der Compiler soll in diesem Fall einen VMT-Eintrag anlegen, damit er es weiß.
Delphi kennt keine virtuellen Properties.
Case closed.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: "Fehler" bei Überschreiben von Properties

  Alt 5. Feb 2007, 23:44
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:03 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