2014-07-09 43 views
0
class A 
{ 
    private int aa = 1; 
} 

class B : A 
{ 
    private int bb = 5; 

    void DoStuff() 
    { 
     aa = bb; //Error, as it should 
    } 
} 

對戰:如何使該類內的派生類不能訪問私有成員?

class A 
{ 
    private int aa = 1; 
    class B : A 
    { 
     private int bb = 5; 

     void DoStuff() 
     { 
      aa = bb; //Not an error, bummer 
     } 
    } 
} 

同樣的東西,只是組織形式不同。我正在使用組織我的類的第二種方法,因爲它看起來非常乾淨,無法繼承我正在做的事情。我的問題是,在上面的例子中,我不希望A的私人成員可以訪問B,即使它在A裏面。我開始明白這是系統地做這件事的關鍵,但是我真的被迫如果我希望A的私人成員是B的私人成員,讓他們分開?

+2

B類對於A以外的任何東西(在你的第二個例子中)都會隱藏起來,所以你爲什麼希望把B中的信息隱藏起來? –

+0

請注意,這不是派生,這是*嵌套*。派生實際上會使用繼承。 – BradleyDotNET

回答

6

是的,你真的不得不保持獨立的聲明,如果你不想做B訪問A的私有成員,因爲嵌套類可以訪問其包含類的私有成員。

4

你不能那樣做。

嵌套類是一個類的成員,就像一個方法。所有集體成員都可以看到其他成員,甚至私人。就像您可以從方法中看到私有字段一樣。

如果你想做到這一點,這可能意味着你的嵌套類不應該被嵌套在首位。

2

我真的不得不讓他們分開,如果我想A的私人成員是從B私人?

是的。從the documentation

嵌套類型可以訪問所有可以訪問其包含類型的成員。它可以訪問包含類型的私有和受保護成員,包括任何繼承的受保護成員。

而且它爲什麼重要?既然你控制B發生的事情,如果你不想B使用任何從A然後不使用它

0

這裏所有其他的答案都在提的是,你不能完成你正在嘗試做的,如果你的嵌套類,而不是使用單獨的聲明和繼承正確。

有一件事你應該檢查的背後是你在做什麼真正的設計,讓這種引導你選擇什麼樣的設計方法。

如果你不打算讓任何外部類訪問Class B和它的功能範圍內Class A嚴格要求,那麼就沒有辦法(沒有真正需要)隱藏的A成員從B因爲B在這case 實際上是A的成員,具有與該類中的方法相同的訪問權限。

如果你打算把這個類暴露給其他潛在的類,那麼它就是設計問題(不是代碼清潔/組織問題),它應該引導你到第一個方法,並保持聲明的分離。

相關問題