Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Compiler Anweisung strict protected (https://www.delphipraxis.net/183884-compiler-anweisung-strict-protected.html)

ATS3788 11. Feb 2015 17:39

Compiler Anweisung strict protected
 
Hallo Freunde des großen Delphi

Ich bin bei dem Ribbon Interface von Bilsen
auf die
Compiler Anweisung strict protected
gestoßen. Was ist denn das schon wider.
Protected ist klar aber das "Strict".
Was ist der Unterschied ?

mkinzler 11. Feb 2015 17:44

AW: Compiler Anweisung strict protected
 
Das dies auch innerhalb einer Unit gilt.

Stevie 11. Feb 2015 17:51

AW: Compiler Anweisung strict protected
 
Normalerweise sind private und protected innerhalb derselben Unit nicht gültig. D.h. du kannst von außerhalb dieser Klasse auch auf die Member zugreifen. Der Zusatz strict setzt diese Sichtbarkeit auch innerhalb derselben Unit durch, was zu weniger verwobenem Code führen kann. Die Auswirkungen merkt man meist erst, wenn man mal 2 so verzahnte Klassen (beide greifen gegenseitig auf private und protected Member zu) in ihre eigenen Units verschieben möchte.

Kleiner Wermutstropfen, solltest du selber die Benutzung in Betracht ziehen - die Codevervollständigung kommt auch Jahre nach Einführung dieser keywords nicht so toll damit zurande. :(

klgid 11. Feb 2015 18:01

AW: Compiler Anweisung strict protected
 
Wie ich gerade vor Kurzem lernen musste, sind 'private' und 'protected' nur für die Sichtbarkeit (also sozusagen Vorschläge)
und können in abgeleiteten Objekten geändert werden.
"strict" sorgt dafür, dass sie funktionieren, wie man es aus anderen Sprachen kennt ...

DeddyH 11. Feb 2015 18:14

AW: Compiler Anweisung strict protected
 
Das stimmt so nicht ganz. Private-Member sind nur innerhalb der eigenen Klasse sichtbar, Protected-Member auch in abgeleiteten Klassen. Delphi hat diese Sichtbarkeiten aber aufgeweicht: stehen 2 Klassen innerhalb derselben Unit, so haben sie auch Zugriff auf private und protected Member der jeweils anderen Klasse, was dem Prinzip der Kapselung widerspricht. Probleme gibt es daher dann, wenn man diesen Umstand zunächst ausgenutzt, später die Klassen aber aus Gründen der Übersichtlichkeit auf verschiedene Units aufgeteilt hat. Daher wurde das "strict" eingeführt, was die Sichtbarkeiten im Sinne der Kapselung durchsetzt, so dass Klassen keinen Zugriff auf strict private und strict protected (es sei denn, es ist eine abgeleitete Klasse) mehr erhalten.

klgid 11. Feb 2015 18:41

AW: Compiler Anweisung strict protected
 
Genau das dachte ich auch.

Ich ging auch davon aus, dass das auch für abgeleitete Objekte gilt.
Leider musste ich mich in einer HandsOn-Experience auf unserem letzten DelpHHianer-Meeting eines besseren belehren lassen:

Klasse ClassA hat ein private Feld FFieldA.
Klasse ClassB wird - in einer gesonderten Unit - von ClassA abgeleitet und definiert FFieldA erneut, diesmal als public.
Damit greifen wir nunmehr public auf FFieldA von ClassA zu ...

Ich habe den Code selbst getippt, es stimmt wirklich.
Wenn ClassA allerdings FFieldA als STRICT private deklariert, funktioniert das nicht mehr.

Ach ja:
Helper Classes haben auch direkten Zugriff auf alles ...

himitsu 11. Feb 2015 18:57

AW: Compiler Anweisung strict protected
 
Zitat:

Zitat von klgid (Beitrag 1289551)
von ClassA abgeleitet und definiert FFieldA erneut

Feld = "Variable"?

Nein, dann wird die Sichtbarkeit nicht geändert, sondern zu hast zwei Felder, die zufällig gleich heißen.

Sir Rufo 11. Feb 2015 19:04

AW: Compiler Anweisung strict protected
 
Hier habe ich das mal erklärt
http://stackoverflow.com/questions/1...58763#16558763

himitsu 11. Feb 2015 19:07

AW: Compiler Anweisung strict protected
 
Und das Andere auch noch als Beispiel:
Delphi-Quellcode:
type
  TKlasseA = class
    FFeld: Integer;
  end;
  TKlasseB = class(TKlasseA)
    FFeld: Integer;
    constructor Create;
  end;

constructor TKlasseB.Create;
begin
  FFeld := 123;
  inherited FFeld := 456;
  ShowMessage(Format('%d %d', [FFeld, inherited FFeld]))
end;
Aber da aus unerfindlichen Gründen inherited nicht bei Feldern funktioniert, noch schnell ein Property oder Getter/Setter dazwischen.
Delphi-Quellcode:
type
  TKlasseA = class
    FFeld: Integer;
    property Feld: Integer read FFeld write FFeld;
  end;
  TKlasseB = class(TKlasseA)
    FFeld: Integer;
    property Feld: Integer read FFeld write FFeld;
    constructor Create;
  end;

constructor TKlasseB.Create;
begin
  Feld := 123;
  inherited Feld := 456;
  ShowMessage(Format('%d %d', [Feld, inherited Feld]))
end;
Und nun noch schnell aufrufen.
Delphi-Quellcode:
TKlasseB.Create.Free;
Aber da man Felder sowieso niemals öffentlich deklarieren sollte, sondern nur Private und in sonderfällen maximal Protected, ist das egal, denn die Sichbarkeit der Property, für den Zugriff darauf, kann man ja verschieben.

Der schöne Günther 11. Feb 2015 19:16

AW: Compiler Anweisung strict protected
 
Zitat:

Zitat von klgid (Beitrag 1289551)
Helper Classes haben auch direkten Zugriff auf alles ...

Dass Helferklassen auch auf private Attribute zugreifen können ist beabsichtigt. Ist anderswo zwar anders, aber ob das nun besser oder schlechter ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.
Seite 1 von 3  1 23      

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