![]() |
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:
Unit 2:
type TA = class(TObject)
protected myField : TObject; end;
Code:
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.
type TB = class(TA)
procedure copyFrom(src : TA); end; ... procedure TB.copyFrom(src : TA); begin self.myField := src.myField; end; |
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; |
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. |
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. ;) |
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. |
AW: Zugriff auf protected-Felder eines Methodenparameter
Zitat:
Mit
Delphi-Quellcode:
verhält es sich ebenso innerhalb einer Unit.
Private
Um dieses strikte Verhalten auch innerhalb einer Unit zu bekommen gibt es das
Delphi-Quellcode:
.
strict
;) |
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 02:41 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