如果我們繼承一個類,私有變量是否也被繼承?如果我們繼承一個類,私有變量是否也被繼承?
我知道「是,變量繼承,但不能由類接口直接訪問。」
我想知道的是我們如何可以訪問私有變量/從孩子的方法類
我想說的是,私人成員也是繼承。但如何訪問它們而不使它們受到保護。
如果我們繼承一個類,私有變量是否也被繼承?如果我們繼承一個類,私有變量是否也被繼承?
我知道「是,變量繼承,但不能由類接口直接訪問。」
我想知道的是我們如何可以訪問私有變量/從孩子的方法類
我想說的是,私人成員也是繼承。但如何訪問它們而不使它們受到保護。
我想知道的是我們如何能夠從子類訪問私有變量/方法 ......... 但如何訪問相同而沒有讓他們的保護。
您可能需要使用reflection嘗試:
這裏是一個similar question/answer解釋如何可以做到這一點。
請不要只發佈一個鏈接作爲您答案的唯一內容。 –
我知道「是的,變量是繼承的,但不能直接被類接口訪問。」
所以你知道答案。
我想知道的是我們如何能夠從子類
你不能訪問私有變量/方法,這就是爲什麼他們是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)}");
}
}
我想說的是私人成員也是繼承的,但如何在不保護它們的情況下訪問相同的成員。 –
我回答說:你不能直接訪問它們。 –
但如何訪問它們,如果你想? Ans是通過使用反射! –
讓它protected
屬性,而不是private
成員。
但不,請不要,至少不要變數。改爲使用受保護的屬性,否則就像公開變量時一樣泄漏實現細節。 –
有人問到如何僅在子類中訪問變量或方法。 –
是的。但是使變量'protected'是一個糟糕的解決方案。 –
您只能使用reflection訪問派生類中的私有變量/方法。你不能以「自然」的方式訪問它們,因爲使它們成爲private
的關鍵就是將它們從其他類(包括派生類)中隱藏起來。
你不能(實際上你可以),因爲他們*私人*。 –
@閱讀我的答案。 –
對不起,如果我不能讓你都明白我的查詢。謝謝大家。 –