2013-01-19 96 views
0

假設下面的類結構:爲什麼不是Java讓我叫這個保護功能

內部命名空間的命名空間

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; 
    } 
} 

所以蝕意味着我

將'action'的可見性更改爲'pr保護'

我感覺有些被愚弄。

爲什麼我被允許執行操作,但不能調用它?我訪問someVal也沒有問題。

我很熟悉將B複製到同一個命名空間,但是我有很多擴展B或類似C和D等的類,並且希望它們按順序排列。

或者更改我的問題: 這個包是否是唯一的方法來強制我的類具有受保護的方法,但是將其隱藏到客戶端代碼中?

+1

這是因爲'a.action()'是** abstract **,它通常意味着它是由基類定義的,但是直到後代才這樣做。沒有'base.action()'來訪問。 –

+0

什麼類型的對象列表A有? – Renjith

+0

@KenWhite我有一個'A'的實際實現列表,它們都被迫執行'action()'。因此不能缺少那種方法 –

回答

2

從靜態打字的角度來看a可能不是B的一個實例。你不能觸摸非後代類的保護(除了通過相同的包出去)。如果有的話,protected應該很少使用。

+0

我認爲受保護的手段'可以看到這個和包中的子類或類。爲什麼我可以訪問具有相同關鍵字的someVal? –

+0

@RafaelIT - 再次閱讀。請注意,B不在/ A的包裝內。 –

+1

@RafaelT'someVal'實際上是'this.someVal'。 'this'靜態地是'B'的一個實例。 (同樣在'this'(a'B')執行'action',而在'A'上調用'a.action()'。) –

相關問題