2013-08-05 233 views
1

我已經閱讀了全部因特網和書籍,protected成員只能在類內和派生類中訪問。我用下面的代碼關於受保護成員的可訪問性

class Program 
{ 
    static void Main(string[] args) 
    { 

    } 
} 
abstract class A 
{ 
    protected int n_IntA = 0; 
    public abstract void AMethod(); 
} 
abstract class B : A 
{ 
    int nb; 
    public B() 
    { 

    } 
    public abstract void GetProtected();  
    public override void AMethod() 
    { 

    } 
} 
class C : B 
{ 
    public override void GetProtected() 
    { 
     // Here n_IntA is accessible why ?? 
    } 
} 

但這裏C級實驗n_IntA是入店。爲什麼? A的派生類是B。因此n_IntA的可訪問性必須高於B類?

+0

因爲C繼承繼承from B繼承自A. – Belogix

+0

@Belogix這意味着這個成員將可以被所有那些維護這個繼承鏈的類訪問 –

+0

這是正確的,一切都從'System.Object'繼承,不管有多少事情是在頂部。除非你隱藏(使用'new'),否則如果你願意的話,這些物品會起泡。 – Belogix

回答

2

可訪問性通過繼承樹的所有

如果您沒有明確隱藏成員,例如使用new -operator,則可以在繼承樹下訪問這些成員。
看看MSDN,看看WinForms和WPF類中繼承的深度。如果您無法訪問System.Object整個框架將打破定義的成員......

MSDN

使用訪問修飾符,公共,保護,內部,或祕密地以指定的一個在宣佈成員可訪問性級別之後。

...
保護| Access僅限於從包含類派生的包含類或類型。

2

受保護的成員總是可以從派生類訪問,無論層級是什麼級別。這裏的問題n_IntA是訪問,因爲

C來自B中從A

你也沒有修改在B類的符繼承它仍然B中的保護,同樣的事情發生於C