Thema: Delphi Delphi - Eigenschaften

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.743 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 11:16
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 : propxyz 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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (12. Feb 2018 um 11:18 Uhr)
  Mit Zitat antworten Zitat