Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

ICH habe den ältesten OOP-Bug entdeckt :firejump: , leider.

  Alt 6. Nov 2017, 16:06
Delphi-Version: XE
Gegeben sei
Delphi-Quellcode:
type
  TFirstComp = class
  protected
    FTest: string;
    procedure SetTest(Value: string);
  published
    property TestProp: string read FTest write SetTest;
  end;
Da kann man nun die Property-Deklaration überschreiben/ändern:
Delphi-Quellcode:
type
  TSecondComp = class(TFirstComp)
  protected
    function StoredTest(Index: Integer): Boolean;
  published
    property TestProp index 1 stored StoredTest;
  end;
Viele nutzen dass, um den Getter/Setter zu ändern, wenn sich keine Getter/Setter-Methode überschreiben (override) lässt.
Sehr bekannt ist sowas auch für das Ändern des Defaultwertes. Oder zum Verschieben der Sichtbarkeit.

Nur knallt das jetzt, wenn z.B. das Property aus der DFM gelesen wird,
denn Delphi ruft SetTest nun freudig mit zwei Parametern auf, obwohl es nur einen Parameter gibt.


Schon, bissl blöd, dass TReader den "INDEX" aus der aktuellen Implementation verwendet, obwohl es in der Basisklasse garkeinen Index gibt.
Aber OK, dann wäre es zumindestens gut, wenn der Compiler hier wenigstens einen Hinweis oder besser noch einen Fehler mir entgegen werfen täte. (fast 2 Tage lang gesucht)

Eine Lösung wäre jetzt auch den Setter zu überschreiben:
Delphi-Quellcode:
type
  TSecondBugfixComp = class(TFirstComp)
  protected
    procedure SetTest(Index: Integer; Value: string);
    function StoredTest(Index: Integer): Boolean;
  published
    property TestProp index 1 write SetTest stored StoredTest;
  end;
So geht es erstmal, bis irgendwann TFirstComp auch einen Getter bekommt und es wieder knallt.

Alles überschreiben oder besser noch gleich das alte Property verdecken und durch eine Neudeklaration ersetzen:
Delphi-Quellcode:
type
  TSecondBugfix2Comp = class(TFirstComp)
  protected
    function GetTest(Index: Integer): string;
    procedure SetTest(Index: Integer; Value: string);
    function StoredTest(Index: Integer): Boolean;
  published
    property TestProp: string index 1 read GetTest write SetTest stored StoredTest;
  end;
Eigentlich wollte ich mir Arbeit ersparen und den Code kürzer/übersichtlicher halten, indem ich für mehrere Property nur eine StoredProc verwende, anstatt jeweils eine Eigene.
$2B or not $2B
  Mit Zitat antworten Zitat