Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Aufrufkontext von protected (https://www.delphipraxis.net/194561-aufrufkontext-von-protected.html)

Rabenrecht 7. Dez 2017 13:32

Delphi-Version: 5

Aufrufkontext von protected
 
Man denke sich folgende Struktur:

Delphi-Quellcode:
//Unit1:
type
  A = Class
  protected
    procedure DoStuffA;
  end;

//Unit2:
type
  B = Class(A)
  private
    FOtherObject : TSomeOtherObject;
  public
    procedure DoStuffB;
  end;

implementation

procedure B.DoStuffB;
begin
  FOtherObject.InstanceOfB.DoStuffA;
end;

//Unit3
type
  C = class (A)
  private
    FOtherObject : TSomeOtherObject;
  public
    procedure DoStuffC;
  end;

implementation

procedure C.DoStuffC;
begin
  FOtherObject.InstanceOfB.DoStuffA;
end;

//Unit99
type
  TSomeOtherObject = Class
  public
    InstanceOfB : B;
  end;
Im Fall der Klasse C spukt der Compiler die Nachricht "Auf protected Symbol A.DoStuffA kann nicht zugegriffen werden".
Im Fall der Klasse B bleibt der Compiler ruhig.

Gibt es hierfür eine sinnvolle Begründung?

sakura 7. Dez 2017 13:34

AW: B =Aufrufkontext von protected
 
Zitat:

Zitat von Rabenrecht (Beitrag 1388202)
Gibt es hierfür eine sinnvolle Begründung?

Bei Design. Innerhalb einer Unit ist alles public, außer Du schreibst strict private bzw. strict protected.

...:cat:...

Rabenrecht 7. Dez 2017 13:45

AW: Aufrufkontext von protected
 
Aber es sind alles unterschiedliche Units.

himitsu 7. Dez 2017 14:02

AW: Aufrufkontext von protected
 
B erbt von A, also hat es auch Zugriff auf das Protected von A.

Rabenrecht 7. Dez 2017 14:28

AW: Aufrufkontext von protected
 
C erbt aber auch von A.

DeddyH 7. Dez 2017 14:44

AW: Aufrufkontext von protected
 
Aber Du rufst ja nicht die Methode von C auf, sondern von dessen interner Instanz von B, und da ist diese protected.

himitsu 7. Dez 2017 14:55

AW: Aufrufkontext von protected
 
B greift in der der Unit "extern" auf eine Instanz von B zu, wo B deklariert ist, also hat es die unit-lokalen Rechte, wo alles Lokale wie "public" ist (außer bei Strict).
B greift auch "extern" auf eine Instanz von B zu, wo B aber nicht deklariert ist, also hat es die "realen" Rechte, wo es natürlich Protected ist.


Delphi-Quellcode:
type
  TEditAccess = class(TEdit);

TEditAccess(EineEditInstanz).EineProtectedMethode;

Wie DeddyH schon sagte:
Wenn du direkt auf diese Methode zureifst (
Delphi-Quellcode:
Self.DoStuff
), dann siehst du es mit den inneren Rechten der eigenen Klasse, wo es Protected ist, also für dich immer wie public.
Du greifst aber extern auf die Funktion einer "anderen" Instanz drauf zu.

Mit
Delphi-Quellcode:
strict protected
würde auch B knallen, da damit der unit-lokale Einfluss gebugfixt wurde.
Innerhalb einer Unit ist Alles, was dort deklariert wurde, wie public (mit Ausnahme der Strict-Private und Strict-Protected).


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 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