2010-12-02 7 views
0

私はこのようなコードを持っていますが、エラーを出すことで保護されたメンバーにアクセスすることはできません。サブクラスでそのオブジェクトを作成すると、クラスのプロテクトメソッドにアクセスできないのはなぜですか?

**Class A 
{ 
protected void m1() 
     { 
     some code 
     } 
} 
Class B:A 
{ 
B b=new B(); 
b.m1();// Ok works fine 
A a =new a(); 
a.m1();/// don't work, compile time error 
A a2=new B(); 
a2.m1(); //compile time error, don't work 
}** 

は、ちょうどこの背後にある理由、上記のコード、サイドアウトアクセスすることはできません同じクラスのオブジェクトを使用して、クラスの理由方法のなぜそんなに異常な自然を得ていません。私はこれを少し探したが、アンダーサンドにしなかったが、コンパイラの性質が現れていることが分かったが、私は理解しなかった。

答えて

1

基本メンバーを呼び出す場合は、baseというキーワードでプレフィックスを付けることができます。 protectedは、メンバーが子孫によって継承され、指定された方法で呼び出すことができることを意味します。

あなたのクラスのa.m1()Bコードからの呼び出しとは何の違いもありません。

+0

どのようにですか?あなたのクラスでa.m1()を呼び出すことは、Bコードからフォームを呼び出すこととの違いはありません。 "サブクラスからm1()を呼び出していますが、どこにアクセスできないのですか? – NoviceToDotNet

+0

これは、プライベートやプロテクトなどのアクセス修飾子によって適用される保護レベルです。オブジェクトを介してメンバーへのアクセスが許可されていないことを意味します。そうでなければ、誰かがアクセス権を持っていればそのメンバーは公開されていますが、そのクラスのメソッドでそのメンバーにアクセスし、その子孫(保護されていないメンバーの場合は秘密ではない)は法律である –

+0

だから、上記のコードでは、私はクラスCのクラスBのオブジェクトを作成し、クラスAの保護されたメソッドにアクセスしようとすると、その場合は、継承していないCと言う3番目のクラスがあると仮定します。アクセスできますか?そうでない場合はなぜですか? – NoviceToDotNet

1

上記のように、クラス内のprotectedメソッドは、元のコンテナを継承するクラスによってのみアクセスできます。あなたのケースでは、Bがサブクラスであり、aがベースです。あなたのBクラスの中で、あなたはAクラス( 'a')の新しいインスタンスを作成しています、そして今は別のオブジェクトです(Bクラスはこの新しいオブジェクトAを気にしません)。この新しいオブジェクト 'a'は保護されたメソッドを公開しないので、 'a.m1()'はコンパイルエラーをスローします。

+0

のメソッドの本体の中でメソッドは静的なものです、それはAクラスのオブジェクトに属していませんか? – NoviceToDotNet

関連する問題