【问题标题】:If we inherit a class do the private variables also get inherited?如果我们继承一个类,私有变量也会被继承吗?
【发布时间】:2012-06-03 15:44:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你不能(其实你可以)因为它们是私有的
  • 对不起,如果我不能让你们都理解我的查询。谢谢大家。

标签: c# oop


【解决方案1】:

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

那么你就知道答案了。

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

你不能,这就是为什么他们是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 是使用反射!!
  • @KonradRudolph 同意。但我在一次采访中被问到这个问题。所以对我来说,这不是关于为什么,而是关于如何。
  • @NareshRavlani 这是一个很好的理由。我在回答中包含了一个最小的示例。
【解决方案2】:

将其设为protected 属性而不是private 成员。

【讨论】:

  • 但是不,请不要,至少不要变量。请改用受保护的属性,否则您会像公开变量一样泄露实现细节。
  • 问题是关于如何只在子类中访问变量或方法。
  • 是的。但是制作变量protected 是一个糟糕的解决方案。
  • 来自问题“但是如何在不保护它们的情况下访问它们。”
【解决方案3】:

使它们受到保护。对于变量,创建一个受保护的属性供子类使用。

【讨论】:

  • +1 表示受保护的属性。受保护的合同也是一个合同......这是一个坏主意 - 公开受保护的字段。
  • 来自问题“但是如何在不保护它们的情况下访问它们。”
  • @Matsemann 这个问题在我回答后被编辑。当我回答时,那个限制不存在。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    您可能想尝试使用reflection:
    这是一个similar question / answer,它解释了如何做到这一点。

    【讨论】:

    • 请不要只发布链接作为答案的唯一内容。
    猜你喜欢
    • 2019-03-13
    • 2014-11-17
    • 2014-04-06
    • 2011-03-23
    • 2012-12-25
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多