Delphi-PRAXiS
Seite 1 von 2  1 2   

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)

jsphde 11. Feb 2018 19:28

Delphi - Eigenschaften
 
Guten Abend allerseits,

ich hätte eine Frage zu Klasseneigenschaften in Delphi:

Beispiel:
Delphi-Quellcode:
type
  TTest = class
    public
      Eins: String;
      property Zwei //[...]
    published
    protected
    private    
  end;
Man kann ja auf beides zugreifen, sobald man eine Instanz erstellt hat.
Meine Frage dazu:
Was ist der Unterschied zwischen Eins und Zwei ? Man kann von außen auf beide zugreifen, sie lesen und ggf. überschreiben.
(Eventuell ist der Verwendungszweck unterschiedlich, wenn Ja, wann verwendet man Eins wann Zwei?)
Soweit ich weiß, wird beides als "Eigenschaft" bezeichnet.

Mit freundlichen Grüßen

mkinzler 11. Feb 2018 19:42

AW: Delphi - Eigenschaften
 
Properties existieren nur im Code nicht zur Laufzeit. Sie dienen als "Trick" um einerseits information hiding/blackbox zu gewährleisten und andererseits "direkten" Zugriff auf Eigenschaften zu bieten.

Delphi-Quellcode:
type
  TTest = class
    private
      FEins: Integer;
      function getZwei: Integer;
    published
      property Eins: Integer read FEins write FEins;
      property Zwei: Integer read getZwei;
   end;

...
   Test := TTest.Create;
Delphi-Quellcode:
   
   Test.Eins = 200;
   h := Test.Zwei;
wird zu
Delphi-Quellcode:
   
   Test.FEins = 200;
   h := Test.getZwei;

jsphde 11. Feb 2018 19:53

AW: Delphi - Eigenschaften
 
Vielen Dank für deine Antwort.

Also könnte man sagen, dass man "Eins" nur innerhalb der Klasse verwendet und von außen
über "Zwei" (property) darauf zugreift? (In der Praxis)



Mit freundlichen Grüßen

mkinzler 11. Feb 2018 19:57

AW: Delphi - Eigenschaften
 
Das ist der Unterschied zwischen private (eigentlich nur strict private) und public.
Auf eine private Property kann auch nicht von ausserhalb( der Unit) zugegriffen werden. Auf eine public Eigenschaft aber schon.

Der Compiler ersetzt die Zugriffe auf eine Property mit der angegeben "Funktion": Lesezugriffe mit der bei read Schreibzugriffe mir der bei write.

jsphde 11. Feb 2018 19:59

AW: Delphi - Eigenschaften
 
Vielen Dank

himitsu 11. Feb 2018 22:40

AW: Delphi - Eigenschaften
 
Jupp, von der Definition her ist es erstmal rech einfach zu verstehen:

private kann nur die Klasse selber, also auch keine Nachfahren
protected kann nur die Klasse und ihre Nachfahren
public können Alle
und published ist wie public mit Zusatzinfos für das Streaming, also da können auch auch fremde Klassen über die TypeInfo (RTTI) drauf zugreifen.


published: siehe Unit Delphi-Referenz durchsuchenTypInfo sowie Delphi-Referenz durchsuchenTObject.MethodAddress, Delphi-Referenz durchsuchenTObject.MethodName und Delphi-Referenz durchsuchenTObject.FieldAddress.
Für Klassen ab Delphi-Referenz durchsuchenTPersistent/TComponent ist die Standatd-Sichtbarkeit von public auf published geändert > siehe {$TYPEINFO} / {$M+}
Diese Funktionen werden z.B. für das Streaming der DFM verwendet.

Und dann noch der Sonderfall innerhalb der eigenen Unit.
Innerhalb einer Unit ist ALLES dort Deklarierte wie public, also auch fremde Prozeduren und Klassen dürfen auf alles zugreifen.
Darum wurde inzwischen das strict eingeführt, also strict private und strict protected sind nur dort so, wie es die Grunddefinion für private und protected besagt.

Ghostwalker 12. Feb 2018 08:49

AW: Delphi - Eigenschaften
 
Zusätzlich zu dem oben genannten, kannst du den Zugriff auf Properties genauer steuern, da du Funktionen/Prozeduren für das Lesen und Schreiben einer Property hinterlegen kannst.

Beispiel:

Delphi-Quellcode:
Type
  TTest = Class
  private
     fname : string;
  protected
    Procedure SetName(const value:string);
    function GetName:string;
  public
  published
    Property Name: string read GetName write SetName;
  end;

Implementation
   
   Procedure TTest.SetName(const value:string);
   begin
     if (copy(value,1,2) = 'XX') then
       fname := value;
   end;

   function TTest.GetName:string;
   begin
    result := copy(fname,3);
   end;
In dem Beispiel wird der Wert von Property Name nur gesetzt, wenn der zu setzende Wert mit 'XX' anfängt.
Beim lesenden Zugriff werden die ersten beiden Zeichen weggelassen.

Zugegeben ist das Beispiel nicht sehr sinnvoll, aber sollte die vorgehensweise demonstrieren.

Sinnvolle Anwendungen gibts haufenweise (Prüfungen beim Setzten, Abhängigkeiten verschiedener Properites untereinander....).

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

AW: Delphi - Eigenschaften
 
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.

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.

Ghostwalker 12. Feb 2018 09:38

AW: Delphi - Eigenschaften
 
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.

Delphi-Quellcode:
  TTest = Class
  private
     fvalue : string;
  protected
     Procedure SetValue(const value:string);
  public
     property Value : String read fvalue write SetValue;
Sowas ?

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.

Was hindert dich daran, das in Delphi genauso zu machen ?

Delphi-Quellcode:
   TTest = Class
   private
     fvalue : string;
   public
     function GetValue:string;
     procedure SetValue(const str : String);

Der schöne Günther 12. Feb 2018 10:07

AW: Delphi - Eigenschaften
 
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.

Zitat:

Zitat von Ghostwalker (Beitrag 1393599)
Was hindert dich daran, das in Delphi genauso zu machen ?

Nichts. Deswegen tue ich es auch. Ich wollte nur mein Unverständnis ausdrücken was man durch Properties in seinem Code überhaupt gewinnt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 Uhr.
Seite 1 von 2  1 2   

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