所以我浏览了一些代码而且我遇到了:
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!";
}
}
}
有人可以解释如何使用/访问私有变量“message”,即使它是私有的吗?
答案 0 :(得分:9)
类中的所有代码都可以访问私有成员,包括嵌套类
如果您将Employee
课程移到Person
课程之外,那么在您填写protected
字段之前它将会失败。
答案 1 :(得分:4)
简单的事实是,这是有效的,因为编译器允许它 - 设计师认为这是一件好事。编译代码后,私有/公共变量以完全相同的方式存储在内存中。 (CLR只是知道它们的不同元数据属性。)
对齐是:嵌套类及其成员仍被视为在父类中概念上/层次上。因此,父类的私有成员始终可以通过这些语义访问。此外,在很多情况下,它只会让程序员轻松生活,而不会破坏面向对象的封装规则!
事实上,如果你想在代码方面考虑这个问题,那么属于给定类的开放式和闭式大括号内的任何代码都可以访问其私有成员,无论它是否立即位于嵌套的类/ struct / etc中。
答案 2 :(得分:0)
因为Employee
是Person的内部类。
答案 3 :(得分:0)
Person={private message, private Employee}
私人员工和私人消息是兄弟姐妹,员工可以使用该消息。如果将私有消息分配到另一个类并在Person类之外将其标记为protected / private,则即使使用该类的实例,Employee也将无法再查看或使用它。