【问题标题】:Accessing Private variables in a child class?访问子类中的私有变量?
【发布时间】:2011-11-05 17:25:48
【问题描述】:

所以我在浏览一些代码时遇到了:

public class Person
{
    private string message;

    public override string ToString()
    {
        return message;
    }

    public static Person CreateEmployee()
    {
        return new Employee();
    }

    class Employee : Person
    {
        public Employee()
        {
            this.message = "I inherit private members!";
        }
    }
}

有人可以解释一下私有变量“消息”是如何被使用/访问的吗??

【问题讨论】:

标签: c# oop nested-class private-members


【解决方案1】:

类中的所有代码都可以访问私有成员,包括嵌套类
如果您将Employee 类移到Person 类之外,它将失败,直到您将字段设为protected

【讨论】:

    【解决方案2】:

    简单的事实是,这是因为编译器允许这样做——设计者认为这是一件好事。编译代码后,私有/公共变量以完全相同的方式存储在内存中。 (CLR 只知道它们的不同元数据属性。)

    理由是:嵌套类及其成员仍被认为在概念上/层次上位于父类中。因此,父类的私有成员始终可以通过这些语义访问。此外,在许多情况下,它只是让程序员的生活变得轻松而不会破坏面向对象的封装规则!

    事实上,如果您想从代码的角度来考虑这一点,任何位于给定类的左大括号和右大括号内的代码都可以访问它的私有成员,无论它是否立即位于嵌套类/结构/等中。

    【讨论】:

    • 是否可以阻止嵌套类继承“私有”函数/变量?
    • 是的;不要嵌套它们。他们没有“继承”成员,成员是真正私有的。
    【解决方案3】:

    因为Employee 是Person 的内部类。

    看到这个问题:can-inner-classes-access-private-variables

    【讨论】:

    • Eek,看到 C# 并阅读 C++ ......仍然来自其他(正确)答案,原则是相同的。
    【解决方案4】:
    Person={private message, private Employee}
    

    Private Employee 和私人消息是兄弟,Employee 可以使用消息。如果您将 Private Message 分配给另一个类并在 Person 类之外将其标记为 protected/private,那么即使使用该类的实例,Employee 也将无法再看到或使用它。

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 2015-09-25
      • 2011-01-16
      • 2013-08-06
      • 2015-11-27
      • 2010-10-23
      • 1970-01-01
      • 2020-12-11
      • 2016-05-02
      相关资源
      最近更新 更多