2017-05-23 5 views
1

Ich habe diesen einfachen Code geschrieben:Delphi geschützte Variablen und Konstruktor

type 
    TTestA = class 
    strict protected 
    a: integer; 
    public 
    f: integer; 
    constructor Create(x: Integer); 
    end; 

type 
    TTestB = class(TTestA) 
    strict private 
    c: integer; 
    end; 

Ich benutze strict weil diese Klassen in derselben Einheit wie die TForm1 Klasse. Da a per Definition geschützt ist, sollte es nur in Unterklassen zugänglich sein, aber warum funktioniert dieser Code dann nicht?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    K: TTestB; 
begin 
    k := TTestB.Create(3); 
    value = k.a; //I cannot access a 
end; 

Auch die geschützten können nützlich sein, um eine abstrakte Klasse zu erstellen. Wenn ich in C++ einen Konstruktor als protected deklariere, kann ich keine Instanz des Objekts und nur Unterklassen erstellen. Kann Delphi das tun?

Ich habe das gleiche Problem mit der Variablen und dem Konstruktor.

+0

Sie stellen zwei getrennte Fragen. Das ist gegen StackOverflow-Richtlinien. Bitte verschiebe deine abstrakte Frage auf einen anderen Beitrag. –

+0

Zur ersten Frage: Machen Sie nicht den Fehler, Klassen mit Einheiten zu verwechseln. TForm ist nicht mit einer der Klassen TTestA oder TTestB verbunden. Aber TTestB ist eine Unterklasse (Abkömmling) von TTestA, also sind sie verwandt. –

Antwort

5

Die Antwort ist in Ihrer eigenen Frage:

Da a definitionsgemäß geschützt es sollte nur in Subklassen

Unabhängig von der Tatsache, dass TForm1 verwendet ein lokales k Variable zugänglich seine vom Typ TTestB, da TForm1 selbst keine Unterklasse von TTestA ist, hat es keinen Zugriff auf das Element k.a. TTestB ist eine Unterklasse von TTestA, also intern hat es Zugriff auf a.

Dies ist detaillierter in Embarcadero in der Dokumentation erklärt:

Classes and Objects (Delphi): Visibility of Class Members

7

geschützt Zugang bedeutet "zugänglich in der Klasse und jede Unterklasse".

Das bedeutet, dass a in Ihrem Beispiel werden Methoden in der Klasse TTestB zugänglich sein, aber dies bezieht sich nicht auf Verbraucher von Instanzen TTestB (oder TTestA).

Der Code in TForm1 ist Teil einer Klasse, die nicht eine Unterklasse von TTestA ist.

Anders gesagt TForm1 von TTestA nicht und deshalb zugreifen kann keine privaten oder geschützt Mitglieder k nicht erben.

Verwandte Themen