Auch aus dem Grund dass andere Sprachen ganz hervorragend ohne Properties und nur get.. und set..-Methoden auskommen hab ich persönlich nie gesehen was man durch Properties nun gewonnen hat. Außer noch mehr tippen zu dürfen.
Die Getter und Setter kannst du dir schon ewig automatisch generieren lassen.
> Templates/Live-Templates : prop
xyz und dann nur noch Name und Typ eingeben > fertig
Was Delphi allerdings fehlt ist der Komfortmechanismus dass die Property z.B. nur von protected beschrieben und von public gelesen werden kann, auch wenn die get.. und set..-Methoden eigentlich schon genau das sagen.
Aber dann müsste ich ja alle Getter und Setter gleich public/published machen, weil man (leider) nur die Sichtbarkeit von Properties nachträglich ändern/erhöhen kann. (den Sonderfall mit Override ignoriere ich jetzt mal)
Delphi-Quellcode:
type
// mit normaler Vererbung geht es nicht, auch wenn der Setter eigentlich nur Protected ist, wird er in A2 zusammen mit dem Property nach Public mitgenommen
TMyClassA =
class
strict protected
function MyGetter: Integer;
procedure MySetter(Value: Integer);
strict protected
property MyProp: Integer
read MyGetter
write MySetter;
end;
TMyClassA2 =
class(TMyClassA)
public
property MyProp
read MyGetter;
end;
// Sichtbarkeiten zurückzunehmen geht, auch wenn man sowas eigentlich niemals nie nicht machen würde :)
TMyClassB =
class
strict protected
function MyGetter: Integer;
procedure MySetter(Value: Integer);
public
property MyProp: Integer
read MyGetter;
end;
TMyClassB2 =
class(TMyClassB)
strict protected
property MyProp
write MySetter;
// eigentlich müsste der Compiler hier meckern, weil das bösartig gegen die Vererbungsrichtlinien verstößt (vielleicht meckert er grade nicht, weil alles in der selben Unit liegt und das strict noch recht jung und unausgereift ist)
end;
// aber niemand verbietet dir sowas ;)
TMyClassX =
class
strict private
function MyGetter: Integer;
procedure MySetter(Value: Integer);
strict protected
property MyPropS: Integer
read MyGetter
write MySetter;
public
property MyProp: Integer
read MyGetter;
end;
procedure TForm6.FormCreate(Sender: TObject);
var
A: TMyClassA2;
B: TMyClassB2;
begin
if A.MyProp = 123
then ;
A.MyProp := 123;
if B.MyProp = 666
then ;
B.MyProp := 666;
// [DCC Fehler] E2129 Einer Nur-Lesen Eigenschaft kann kein Wert zugewiesen werden
end;