Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Class helper wird übersprungen wenn...

  Alt 17. Okt 2014, 09:24
Ich verstehe ausnahmsweise bei keinem von euch, was er mir sagen will

Ich stelle noch einmal dar was ich meinte:
  • Man setze einen Class Helper ein der einen Getter ersetzt/verändert. Alles funktioniert wie gewohnt. Ist der Helper im Scope, werden seine Dinge genommen.
  • Man führt in der Klasse eine Property ein welche den normalen Getter benutzt
  • Fragt man nun die Property ab bekommt man den "unbeholfenen" Getter obwohl der Class Helper im Gültigkeitsbereich ist
.

Der Grund: Die Property der Basisklasse weiß nichts vom Helper. Aufrufe auf die Property gehen direkt auf den Getter zu und überspringen die Hilfsmethode komplett.

Hier noch einmal Futter für Quellcode-Freunde:

Delphi-Quellcode:
program Project6;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  ClassUnit in 'ClassUnit.pas',
  ClassHelperUnit in 'ClassHelperUnit.pas';


begin
  try
   WriteLn( TMyClass.Create().getValue() ); // Ergibt 99
   WriteLn( TMyClass.Create().Value ); // Ergibt 42
  except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
Delphi-Quellcode:
unit ClassUnit;
interface

type
   TMyClass = class
      function getValue(): Integer;
      property Value: Integer read getValue;
   end;

implementation

function TMyClass.getValue(): Integer;
begin
   Result := 42;
end;
end.
Delphi-Quellcode:
unit ClassHelperUnit;

interface uses ClassUnit;

type
   TMyClassHelper = class helper for ClassUnit.TMyClass
      function getValue(): Integer;
   end;

implementation

function TMyClassHelper.getValue():Integer;
begin
   Result := 99;
end;
end.

Die Abhilfe wäre, im Klassenhelper die Property auch zu überschreiben. Also eigentlich die Lösung für Leute die alleine denken können und nicht gleich ein Forum überfluten.
Das blöde daran ist nur, dass man gekniffen wird wenn eine Unterklasse (oder eben ein Interface) die Property erst einführt. Dann bekommt man das "unbeholfene" Verhalten ohne es wahrscheinlich zu ahnen. Gefährliche Sachen...

Uwe hatte also von Anfang an recht, ich hätte gleich anfangen können zu weinen. Denn in meinem Fall führt das Interface die Property ein, die Klasse hat die nicht. Und in Delphi gibt es keine Interface-Helper.

Geändert von Der schöne Günther (17. Okt 2014 um 09:28 Uhr)
  Mit Zitat antworten Zitat