【发布时间】:2012-06-03 15:44:02
【问题描述】:
如果我们继承一个类,私有变量也会被继承吗?
我知道“是的,变量是继承的,但类接口不能直接访问。”
我想知道的是如何从子类访问私有变量/方法
我想说的是私有成员也是继承的。但是如何在不保护它们的情况下访问它们。
【问题讨论】:
-
你不能(其实你可以)因为它们是私有的。
-
对不起,如果我不能让你们都理解我的查询。谢谢大家。
如果我们继承一个类,私有变量也会被继承吗?
我知道“是的,变量是继承的,但类接口不能直接访问。”
我想知道的是如何从子类访问私有变量/方法
我想说的是私有成员也是继承的。但是如何在不保护它们的情况下访问它们。
【问题讨论】:
我知道“是的,变量是继承的,但不能通过类接口直接访问。”
那么你就知道答案了。
我想知道的是如何从子类中访问私有变量/方法
你不能,这就是为什么他们是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)}");
}
}
【讨论】:
将其设为protected 属性而不是private 成员。
【讨论】:
protected 是一个糟糕的解决方案。
使它们受到保护。对于变量,创建一个受保护的属性供子类使用。
【讨论】:
您只能使用reflection 从派生类访问私有变量/方法。您不能以“自然”的方式访问它们,因为将它们设为 private 的全部目的是对其他类(包括派生类)隐藏它们。
【讨论】:
我想知道的是我们如何从子类访问私有变量/方法 ………… 但是如何在不保护它们的情况下访问它们。
您可能想尝试使用reflection:
这是一个similar question / answer,它解释了如何做到这一点。
【讨论】: