2012-05-29 116 views
0

如果我們繼承一個類,私有變量是否也被繼承?如果我們繼承一個類,私有變量是否也被繼承?

我知道「是,變量繼承,但不能由類接口直接訪問。

我想知道的是我們如何可以訪問私有變量/從孩子的方法類

我想說的是,私人成員也是繼承。但如何訪問它們而不使它們受到保護。

+0

你不能(實際上你可以),因爲他們*私人*。 –

+0

@閱讀我的答案。 –

+0

對不起,如果我不能讓你都明白我的查詢。謝謝大家。 –

回答

1

我想知道的是我們如何能夠從子類訪問私有變量/方法 ......... 但如何訪問相同而沒有讓他們的保護。

您可能需要使用reflection嘗試:
這裏是一個similar question/answer解釋如何可以做到這一點。

+0

請不要只發佈一個鏈接作爲您答案的唯一內容。 –

10

我知道「是的,變量是繼承的,但不能直接被類接口訪問。」

所以你知道答案。

我想知道的是我們如何能夠從子類

你不能訪問私有變量/方法,這就是爲什麼他們是private(而不是說,protected)。整個意圖使他們private是這樣,你不能從任何地方訪問它們,特別是包括子類。

明確地破解這個封裝幾乎總是一個破碎設計的標誌,不應該成爲正常代碼流的一部分。但是,在某些情況下,您想要推薦某些代碼,並且在這些情況下可能有必要檢查私人價值。反射庫允許這樣做。下面是一個使用System.Reflection能力的一個簡單的例子:

class Widget { 
    private readonly string identifier; 

    public Widget(string identifier) { 
     this.identifier = identifier; 
    } 
} 

class MainClass { 
    public static void Main(string[] args) { 
     var widget = new Widget("my_test_widget"); 

     var type = widget.GetType(); 
     var field = type.GetField("identifier", 
            System.Reflection.BindingFlags.Instance | 
            System.Reflection.BindingFlags.NonPublic); 

     Console.WriteLine($"{field} = {field.GetValue(widget)}"); 
    } 
} 
+0

我想說的是私人成員也是繼承的,但如何在不保護它們的情況下訪問相同的成員。 –

+0

我回答說:你不能直接訪問它們。 –

+0

但如何訪問它們,如果你想? Ans是通過使用反射! –

2

讓它protected屬性,而不是private成員。

+0

但不,請不要,至少不要變數。改爲使用受保護的屬性,否則就像公開變量時一樣泄漏實現細節。 –

+0

有人問到如何僅在子類中訪問變量或方法。 –

+1

是的。但是使變量'protected'是一個糟糕的解決方案。 –

5

使它們受到保護。對於變量,創建一個受保護的屬性,然後子類將使用該屬性。

+1

保護屬性+1。受保護的合同也是合同......這是一個壞主意 - 揭露受保護的領域。 – Dennis

+0

從問題「但是如何訪問它們而不保護它們。」 – Matsemann

+0

@Matsemann我回答後編輯了這個問題。當我回答時,那個限制並不存在。 – Steve

4

您只能使用reflection訪問派生類中的私有變量/方法。你不能以「自然」的方式訪問它們,因爲使它們成爲private的關鍵就是將它們從其他類(包括派生類)中隱藏起來。