Доступ к закрытым переменным в дочернем классе? - PullRequest
2 голосов
/ 29 августа 2011

Итак, я просматривал какой-то код и наткнулся на:

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", даже если она закрыта ??

Ответы [ 4 ]

9 голосов
/ 29 августа 2011

Закрытые члены доступны для всего кода в классе, , включая вложенные классы .
Если вы переместите класс Employee за пределы класса Person, произойдет сбой, пока вы не сделаете поле protected.

4 голосов
/ 29 августа 2011

Простой факт заключается в том, что это работает, потому что компиляторы позволяют это - дизайнеры думали, что это хорошо.Как только код скомпилирован, приватные / публичные переменные сохраняются в памяти точно таким же образом.(CLR просто знает о различных атрибутах метаданных для них.)

Обоснование : вложенные классы и их члены по-прежнему считаются концептуально / иерархически лежащими в родительском классе.Следовательно, закрытые члены родительского класса всегда доступны с помощью этой семантики.Кроме того, во многих случаях это просто облегчает жизнь программистам, не нарушая объектно-ориентированного правила инкапсуляции!

На самом деле, если вы хотите думать об этом с точки зрения кода, любой код которая попадает в открытые и закрытые скобки данного класса, может получить доступ к своим закрытым членам, независимо от того, находится ли он непосредственно во вложенном классе / struct / и т. д.

0 голосов
/ 29 августа 2011
Person={private message, private Employee}

Личное сообщение Сотрудник и личное сообщение являются братьями и сестрами, Сотрудник может использовать это сообщение.Если вы выделите Личное сообщение в другой класс и отметите его как защищенное / личное за пределами класса Person, то Сотрудник не сможет больше видеть или использовать его даже с экземпляром этого класса.

0 голосов
/ 29 августа 2011

Поскольку Employee является внутренним классом Person.

Смотрите этот вопрос: can-inner-classes-access-private-variable

...