0

如果我们继承一个类,私有变量也会被继承吗?

我知道“是的,变量是继承的,但不能通过类接口直接访问。

我想知道的是我们如何从子类访问私有变量/方法

我想说的是私有成员也是继承的。但是如何在不保护它们的情况下访问它们。

4

5 回答 5

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)}");
    }
}
于 2012-05-29T12:05:26.563 回答
5

让他们受到保护。对于变量,创建一个子类然后使用的受保护属性。

于 2012-05-29T12:06:02.967 回答
4

您只能使用反射从派生类访问私有变量/方法。您不能以“自然”的方式访问它们,因为制作它们的全部private目的是对其他类(包括派生类)隐藏它们。

于 2012-05-29T12:07:28.013 回答
2

使其成为protected财产而不是private成员。

于 2012-05-29T12:05:27.393 回答
1

我想知道的是我们如何从子类访问私有变量/方法......但是如何在不保护它们的情况下访问它们。

您可能想尝试使用反射
这是一个类似的问题/答案,解释了如何做到这一点。

于 2012-05-29T12:07:46.583 回答