Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Delphi - Eigenschaften (https://www.delphipraxis.net/195201-delphi-eigenschaften.html)

mkinzler 12. Feb 2018 09:41

AW: Delphi - Eigenschaften
 
Zitat:

Ich wollte nur mein Unverständnis ausdrücken was man durch Properties in seinem Code überhaupt gewinnt.
Der Grund für die Erfindung von Properties heisst Objektinspektor.

Der schöne Günther 12. Feb 2018 09:49

AW: Delphi - Eigenschaften
 
Dass Delphi seit den 90ern seine DFM-Dateien über published Properties serialisiert ist mir klar. Ich sehe nur nicht weshalb man das heute in eigenem Code einsetzen sollte.

Christian Seehase 12. Feb 2018 10:08

AW: Delphi - Eigenschaften
 
Moin Günther,

Zitat:

Zitat von Der schöne Günther (Beitrag 1393610)
Ich sehe nur nicht weshalb man das heute in eigenem Code einsetzen sollte.

Bei visuellen Komponenten kommst Du nicht drum herum, da nur published properties im Object Inspector angezeigt werden.

himitsu 12. Feb 2018 10:16

AW: Delphi - Eigenschaften
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1393598)
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

Zitat:

Zitat von Der schöne Günther (Beitrag 1393598)
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;

Ghostwalker 12. Feb 2018 11:16

AW: Delphi - Eigenschaften
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1393605)
Zitat:

Zitat von Ghostwalker (Beitrag 1393599)
Sowas ?

Ja, das meine ich: Die Property mit ihrem
Delphi-Quellcode:
read
und
Delphi-Quellcode:
write
ist
Delphi-Quellcode:
public
, es darf also jeder dran. Egal wie welchen Zugriff die Methoden oder Felder dahinter haben.

:gruebel::?:

Das ist doch nur eine Frage in welchem Abschnitt ich die Property definiere. Wenn ich nicht möchte, das jemand von "außen" auf die Property zugreifen soll, dann leg ich die Property in einen entsprechenden Abschnitt oder
definier einfach das entsprechende Feld im Abschnitt und mach keine Property draus.

Mit Hilfe der Getter/Setter kann ich, obwohl die Property von "außen" sichtbar ist, den Zugriff auf den Inhalt der Property kontrollieren.

Aber irgendwie hab ich so das Gefühl, das ich nicht so ganz verstehe, worauf du rauswillst :)

Der schöne Günther 12. Feb 2018 16:23

AW: Delphi - Eigenschaften
 
Zitat:

Zitat von Ghostwalker (Beitrag 1393628)
Mit Hilfe der Getter/Setter kann ich, obwohl die Property von "außen" sichtbar ist, den Zugriff auf den Inhalt der Property kontrollieren.

Nein, das kannst du eben nicht: "Zugriff kontrollieren". Die Property kann nicht zwischen "Lesezugriff" und "Schreibzugriff" unterscheiden. Entweder man hat vollen Zugriff auf die Property (dann ist es herzlich egal ob die Getter/Setter nun private, protected oder public sind), oder keinen.

Ich finde es ist ein legitimer Anwendungsfall dass z.B. die Klasse selbst eine Property schreiben, ein Benutzer der Klasse ("von außen") die Property aber nur lesen kann.


Das heißt eine Property kann im Endeffekt sogar weniger als zwei Getter/Setter-Methoden und ist sogar mehr Tipparbeit.

Lemmy 12. Feb 2018 17:20

AW: Delphi - Eigenschaften
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1393610)
Dass Delphi seit den 90ern seine DFM-Dateien über published Properties serialisiert ist mir klar. Ich sehe nur nicht weshalb man das heute in eigenem Code einsetzen sollte.

um seine eigenen Objekte serialisieren/deserialiseren zu können. Die neue RTTI ist da zwar umfangreicher, aber eben auch langsamer.

Zitat:

Zitat von Der schöne Günther (Beitrag 1393663)
Zitat:

Zitat von Ghostwalker (Beitrag 1393628)
Mit Hilfe der Getter/Setter kann ich, obwohl die Property von "außen" sichtbar ist, den Zugriff auf den Inhalt der Property kontrollieren.

Nein, das kannst du eben nicht: "Zugriff kontrollieren". Die Property kann nicht zwischen "Lesezugriff" und "Schreibzugriff" unterscheiden. Entweder man hat vollen Zugriff auf die Property (dann ist es herzlich egal ob die Getter/Setter nun private, protected oder public sind), oder keinen.

ließ das Posting nochmal durch. Ghostwalker meint so was:

Delphi-Quellcode:

TFoo = class(TObject)
private
...
protected
 property Bar: Integer;...
....
end;

Die Sichtbarkeit der Property wird damit gesteuert.

Und über die getter und Setter kann man auch bei public-Properties den Zugriff kontrollieren:

Delphi-Quellcode:

TFoo = class(TObject)
private
...
public
 property Bar: Integer read GetBar write SetBar;
....
end;

...


function TFoo.GetBar: Integer;
begin
  If FAccessRestricted then
    raise Exception.Create()
  else
    result := FBar;
end;
Ob das alles am Ende Sinn macht müssen andere entscheiden... ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz