2017-05-23 4 views
1

を保護しました。 aは定義によって保護されているため、サブクラスでしかアクセスできないはずですが、なぜこのコードが機能しないのですか?Delphiは、私はこの単純なコードを書かれている変数とコンストラクタ

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

また、protectedは抽象クラスを作成するのに便利です。 C++では、コンストラクタをprotectedとして宣言すると、オブジェクトのインスタンスを作成することができず、サブクラスのみができます。デルファイはこれを行うことができますか?

私は変数とコンストラクタで同じ問題が発生しています。

+0

あなたは2つの別々の質問をしています。それはStackOverflowのガイドラインに反しています。抽象的な質問を別の投稿に移動してください。 –

+0

最初の質問について:ユニットと混乱クラスの間違いをしないでください。 TFormは、クラスTTestAまたはTTestBのいずれとも関連していません。しかし、TTestBはTTestAのサブクラス(子孫)であるため、関連しています。 –

答えて

5

答えはあなた自身の問題である:a以来

が定義によって保護されて、それは関係なく、TForm1がローカルk変数を使用するという事実のサブクラスだけ

にアクセスできる必要がありますTTestBTForm1自体はTTestAのサブクラスではないため、k.aメンバーにアクセスすることはできません。 TTestBTTestAのサブクラスなので、内部的にはaにアクセスできます。

これは、エンバカデロの文書でより詳細に説明されています

Classes and Objects (Delphi): Visibility of Class Members

7

保護アクセスは、「クラスのアクセスと任意のサブクラス」を意味します。

これはあなたの例ではaはクラスのメソッドTTestBにアクセスすることを意味するが、これは消費者TTestB(またはTTestA)のインスタンスのには適用されません。

TForm1のコードは、TTestAのサブクラスないクラスの一部です。

TForm1がTTestAから継承されていないため、kのいずれかプライベートまたは保護メンバーにアクセスすることはできません、別の言い方をすれば。

関連する問題