Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zugriff auf protected-Felder eines Methodenparameter (https://www.delphipraxis.net/169384-zugriff-auf-protected-felder-eines-methodenparameter.html)

MStoll 16. Jul 2012 19:44

Zugriff auf protected-Felder eines Methodenparameter
 
Hallo,

ich bin eben in Turbo Delphi 2006 Pro darüber gestolpert, dass ich in Klasse B (Kind von A) nicht auf die protected-Felder einer an B übergebenen Variable vom Typ A zugreifen konnte. Code-Beispiel:

Unit 1:
Code:
type TA = class(TObject)
          protected
             myField : TObject;
          end;
Unit 2:
Code:
type TB = class(TA)
          procedure copyFrom(src : TA);
          end;

...

procedure TB.copyFrom(src : TA);
begin
     self.myField := src.myField;
end;
Das ist jetzt vielleicht eine philosophische Frage. Aber wisst ihr, warum der Zugriff auf src.myField nicht erlaubt ist? Meines Erachtens nach sollte TB als Nachfahre von TA ja "Freund genug" sein, um auf die protected-Felder aller TA-Instanzen zugreifen zu können. So wie ja auch jede Instanz einer Klasse auf die private-Felder aller anderen Instanzen gleichen Typs zugreifen kann.

Bummi 16. Jul 2012 20:38

AW: Zugriff auf protected-Felder eines Methodenparameter
 
nur bei der Vererbung, Du kannst es in diesem Fall umgehen
Delphi-Quellcode:
procedure TB.copyFrom(src : TA);
begin
     myField := TB(src).myField;
end;

himitsu 16. Jul 2012 21:52

AW: Zugriff auf protected-Felder eines Methodenparameter
 
Eigentlich sollte man schon Zugriff auf Protected-Dinge seiner Vorfahren bekommen.
Wie genau lautet denn die Fehlermeldung?



Mit der "neuen" RTTI kommt man oftmals auch an die privaten/protected-Eigenschaften ran.

Aber ansonsten bleibt halt nur die Vererbung, wo bei man ganz offiziell die Sichtbarkeiten verschieben kann (bei Property), bzw. für Funktionen sich eine Umleitung einbaut.
Für den Zugriff reicht dann das blose casten, falls man keine Instanz mit dem abgeleiteten Typen erstellen kann/will ... aber natürlich nur für Protected und nicht für Private.

OK, man kann noch mit wilden Pointern über feste Offsets auf alles Mögliche zugreifen, aber davon sollte man eher die Finger lassen.

Sir Rufo 16. Jul 2012 22:21

AW: Zugriff auf protected-Felder eines Methodenparameter
 
Diese Methode gehört auch in die Klasse TA.

Wenn die in den Nachfahren erweitert werden soll, dann eben als virtual deklariert.
Und wenn die in TA noch nicht sichtbar sein soll, dann eben dort auch als protected. ;)

Furtbichler 17. Jul 2012 06:06

AW: Zugriff auf protected-Felder eines Methodenparameter
 
Gut gut: Aber WARUM kann man nicht auf protected Felder eines Vorfahren zugreifen? Egal welche Workarounds es gibt und egal welche design flaws der Beispielcode beinhaltet.

Bummi hat es mit seiner kompakten Vierwortantwort bereits angedeutet:

Auf protected Felder kann nur innerhalb der eigenen Vererbungshierarchie zugegriffen werden. Diese Felder sind durch Zugriff von außen geschützt. Und die Klasse 'TB' ist für eine Instanz von TA nun mal 'außen', so wie jede andere Klasse auch.

Lustigerweise gibt es eine Hintertür, nämlich wenn 'TA' und 'TB' innerhalb der selben Unit deklariert und implementiert werden. Frag mich nicht, wieso Delphi hier so blöd ist. Is aber so.

Sir Rufo 17. Jul 2012 06:16

AW: Zugriff auf protected-Felder eines Methodenparameter
 
Zitat:

Zitat von Furtbichler (Beitrag 1174868)
Lustigerweise gibt es eine Hintertür, nämlich wenn 'TA' und 'TB' innerhalb der selben Unit deklariert und implementiert werden. Frag mich nicht, wieso Delphi hier so blöd ist. Is aber so.

Lustigerweise gab es hierzu schon mindestens einen Thread wo genau dieses auch diskutiert wurde.
Mit
Delphi-Quellcode:
Private
verhält es sich ebenso innerhalb einer Unit.

Um dieses strikte Verhalten auch innerhalb einer Unit zu bekommen gibt es das
Delphi-Quellcode:
strict
.

;)

Furtbichler 17. Jul 2012 06:26

AW: Zugriff auf protected-Felder eines Methodenparameter
 
An den Thread kann ich mich erinnern, aber nicht an das 'strict'.

Nun weiß ich endlich, wozu das gut ist... Danke :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.

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