AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Zugriff auf protected-Felder eines Methodenparameter
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf protected-Felder eines Methodenparameter

Ein Thema von MStoll · begonnen am 16. Jul 2012 · letzter Beitrag vom 17. Jul 2012
Antwort Antwort
MStoll

Registriert seit: 15. Nov 2005
131 Beiträge
 
Turbo Delphi für Win32
 
#1

Zugriff auf protected-Felder eines Methodenparameter

  Alt 16. Jul 2012, 20:44
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.
"Man soll nie mehr essen als mit Gewalt reingeht!" (n.n.)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Zugriff auf protected-Felder eines Methodenparameter

  Alt 16. Jul 2012, 21:38
nur bei der Vererbung, Du kannst es in diesem Fall umgehen
Delphi-Quellcode:
procedure TB.copyFrom(src : TA);
begin
     myField := TB(src).myField;
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Zugriff auf protected-Felder eines Methodenparameter

  Alt 16. Jul 2012, 22:52
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Jul 2012 um 00:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Zugriff auf protected-Felder eines Methodenparameter

  Alt 16. Jul 2012, 23:21
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Zugriff auf protected-Felder eines Methodenparameter

  Alt 17. Jul 2012, 07:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Zugriff auf protected-Felder eines Methodenparameter

  Alt 17. Jul 2012, 07:16
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 Private verhält es sich ebenso innerhalb einer Unit.

Um dieses strikte Verhalten auch innerhalb einer Unit zu bekommen gibt es das strict .

Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: Zugriff auf protected-Felder eines Methodenparameter

  Alt 17. Jul 2012, 07:26
An den Thread kann ich mich erinnern, aber nicht an das 'strict'.

Nun weiß ich endlich, wozu das gut ist... Danke
  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 04:12 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