3

私はこのようないくつかのシナリオを持っています:

public class BaseClass {
    protected void protectedMethod(OtherObject object) {
    ...
    }
} 

public class Child1 extends BaseClass {
    @Override
    protected void protectedMethod(OtherObject object) {
        super.protectedMethod(object);
        // Custom Child1 logic
        ...
    }
}

public class Child2 extends BaseClass {
    @Override
    protected void protectedMethod(OtherObject object) {
        super.protectedMethod(object);
        // Custom Child2 logic
        ...
    }
}

次に、「BaseClass」オブジェクトの配列を反復処理する「protectedMethod」を呼び出すと、コンパイラは保護されたアクセスエラーを表示します。

OtherObject other = new OtherObject();

BaseClass[] objects = {
    new Child1(),
    new Child2()
}

for (BaseClass object : objects) {
    object.protectedMethod(other); //this line gives me protected access error
}

しかし、私がポリモーフィズムではなく別の方法で同じことを行う場合、それは正常に機能します。

OtherObject other = new OtherObject();

Child1 child1 = new Child1();
Child2 child2 = new Child2();

child1.protectedAccess(other);
child2.protectedAccess(other);

2つの方法の違いはわかりません。

4

3 に答える 3

3

Javaでは、「保護された」アクセス修飾子により、サブクラスだけでなく、同じパッケージ内の他のクラスによるアクセスも許可されます。

最後のコードスニペットがChild1およびChild2と同じパッケージにある場合、Child1およびChild2の保護されたメソッドにアクセスできます。

編集:

独自のパッケージに独自の基本クラスを導入することで、この問題を修正し、ポリモーフィズムを維持できます。

 public MyBaseClass extends BaseClass { 
    @Override
    protected void protectedMethod(OtherObject object) {
        super.protectedMethod(object);
    }
 }

 public Child1 extends MyBaseClass { ... }
 public Child2 extends MyBaseClass { ... }

次に、独自の基本クラスタイプのコレクションを操作します。

 NyBaseClass[] objects = {
    new Child1(),
    new Child2()
 }

 for (MyBaseClass object : objects) {
    object.protectedMethod(other); 
 }   
于 2012-10-03T13:59:43.283 に答える
1

保護された修飾子を持つインスタンス変数とメソッドは、アクセス可能either in derived classまたはでのみアクセス可能other class in the same packageです。

Base classしたがって、あなたが別のパッケージpkg1にあり、あなたderived classesclassあなたが使用しているfromが、クラスパッケージprotected methodの同じパッケージpkg2にある可能性があります。differentbasepkg1

次に、上記のプロパティにより、派生クラスのメソッドにアクセスできるようになります。これは、同じパッケージに含まれているためです。ただし、base classは別のパッケージに含まれているため、スーパークラスではありtest classません。アクセスできません。

編集:-わかりました、これがあなたがあなたを変えることができない場合にあなたがすることができることBase Classです..

for (BaseClass object : objects) {
    if (object instanceof Child1) {
        ((Child1)object).protectedMethod(other);

    } else if(object instanceof Child2) {
        ((Child1)object).protectedMethod(other);
    }
}

しかし、それはあなたの問題からすべての多形性のものを消し去ります...これは単なる回避策です。

于 2012-10-03T13:59:46.980 に答える
0

私はこのエントリをチェックします: Java Protected Method Accessibility

保護されているのは、同じパッケージと子に限定されています。パッケージ外のメソッドにアクセスする必要がある場合は、パブリックにする必要があります。

于 2012-10-03T14:01:38.233 に答える