AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi - Eigenschaften

Ein Thema von jsphde · begonnen am 11. Feb 2018 · letzter Beitrag vom 12. Feb 2018
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#1

AW: Delphi - Eigenschaften

  Alt 11. Feb 2018, 21:40
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 07:49
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....).
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 08:22
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.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 08:38
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 ?

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);
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 09:07
Ja, das meine ich: Die Property mit ihrem read und write ist public , es darf also jeder dran. Egal wie welchen Zugriff die Methoden oder Felder dahinter haben.

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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.874 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 09:41
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 09:49
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.
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 11:16
Ja, das meine ich: Die Property mit ihrem read und write ist public , es darf also jeder dran. Egal wie welchen Zugriff die Methoden oder Felder dahinter haben.


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
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 16:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#10

AW: Delphi - Eigenschaften

  Alt 12. Feb 2018, 10: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;
Ein Therapeut entspricht 1024 Gigapeut.

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz