Как закрытые поля работают в производных классах? - PullRequest
2 голосов
/ 22 марта 2011

Когда я наследую от класса, такого как Button, как свойства Button работают в производном классе?Закрытые поля Button не наследуются в моем производном классе, но разве свойства не должны быть там, чтобы публичные свойства могли обращаться к внутреннему закрытому состоянию?Например, как работает свойство Location в следующем примере?

public class MyClass : Button
{
    MyClass()
    {
        this.Location = new System.Drawing.Point(134, 34);
    }
}

В исходном коде .NET я вижу, что Location реализован как:

public Point Location
{
    get
    {
        return new Point(this.x, this.y);    // x is a private field
    }
    set
    {
        this.SetBounds(value.X, value.Y, 
                       this.width, this.height, 
                       BoundsSpecified.Location);
    }
}

Я не понимаю, почему доступ к this.x и this.y не вызывает ошибку в моем производном классе.

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

Приватность только предотвращает прямой доступ к коду снаружи при компиляции.Действительно, посредством отражения можно напрямую получить доступ к закрытым полям.

Следовательно, частные поля наследуются производным классом, но прямой доступ к ним отсутствует.

Это означает, чтоопределяющий класс может контролировать доступ к ним и следить за тем, чтобы они не были установлены на недопустимые значения или чтобы выполнялась любая работа, которую необходимо выполнить после их изменения, но производный класс все еще может использовать способ, которым они используютсядля реализации защищенных и общественных участников.

0 голосов
/ 22 марта 2011

Я хотел бы предложить вам немного изучить полиморфизм и наследование в C #.Вот ссылка на сайт MSDN, с которой можно начать http://msdn.microsoft.com/en-us/library/ms173149.aspx

В двух словах, когда вы наследуете от родительского класса, например Button, закрытые члены Button по-прежнему доступны и используются в родительском классе.они не отменяются и не исчезают.В производном классе, например MyClass, ни один из закрытых членов Button не доступен напрямую (хотя к ним можно получить доступ посредством отражения).Однако любые открытые или защищенные члены Button доступны в MyClass.

В результате, когда создается и используется MyClass, все открытые методы и свойства Button и MyClass становятся доступными для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...