如果我们继承一个类,私有变量也会被继承吗?
我知道“是的,变量是继承的,但不能通过类接口直接访问。”
我想知道的是如何从子类中访问私有变量/方法
我想说的是私人成员也是继承的。但是如何在不对其进行保护的情况下访问它们。
答案 0 :(得分:10)
我知道“是的,变量是继承的,但不能通过类接口直接访问。”
所以你知道答案。
我想知道的是我们如何从子类
访问私有变量/方法
你不能,这就是为什么他们private
(而不是protected
)。制作private
的整个意图使您无法从任何地方访问它们,特别是包括子类。
明确地破坏这种封装几乎总是设计破坏的标志,不应该成为正常代码流的一部分。但是,在某些情况下,您需要推理 about 某些代码,在这些情况下,甚至可能需要检查私有值。反射库允许这样做。以下是使用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)}");
}
}
答案 1 :(得分:5)
让它们受到保护。对于变量,创建一个子类然后使用的受保护属性。
答案 2 :(得分:4)
您只能使用reflection从派生类访问私有变量/方法。你无法以“自然”的方式访问它们,因为制作它们private
的全部意义是将它们隐藏在其他类(包括派生类)中。
答案 3 :(得分:2)
将其设为protected
,而不是private
成员。
答案 4 :(得分:1)
我想知道的是我们如何从子类访问私有变量/方法 ......... 但是如何在不对它们进行保护的情况下访问它们。
您可能想尝试使用reflection:
这是一个similar question / answer,解释了如何做到这一点。