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.