0

次のクラス構造を想定します。

名前空間 a の内部

public abstract class A {

    protected int someVal;
    protected abstract int action();

}

名前空間 ab で

public class B extends A{

    //magically filled with elements ;)
    List<A> elements; 

    protected int action(){
        someVal = 42; // OK
        int l = 0;
        for (A a : elements){
            l+= a.action(); //FORBIDDEN!!
        }
        return l;
    }
}

だからEclipseは私に提案します

「アクション」の可視性を「保護」に変更します

なんかだまされた気がする。

アクションの実装は許可されているのに、呼び出しは許可されていないのはなぜですか? アクセスも問題ありませんsomeVal

私はB同じ名前空間にコピーすることをよく知っていますが、B または類似の C や D などを拡張する多くのクラスがあり、それらを順番に配置したいと考えています。

または、私の質問を言い換えると: このパケットは、クラスに保護されたメソッドを強制する唯一の方法ですが、それをクライアント コードから非表示にしますか?

4

1 に答える 1

2

静的型付けの観点からaは、 のインスタンスではない可能性がありますB。非子孫クラスのプロテクトに触れることはできません(同じパッケージを介して取得する場合を除く)。protectedあったとしてもめったに使用しないでください。

于 2013-01-19T02:53:56.813 に答える