Почему я не могу получить доступ к полю поддержки на автоматически реализованном свойстве из унаследованного класса - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть класс, который предоставляет автоматически реализованное свойство Enabled

Public MustInherit Class TopLevel
    Protected Property Enabled() As Boolean
End Class

В наследуемом классе я не могу получить доступ к _Enabled

Public Class SubClass
    Inherits TopLevel

    Public Function Foo() As string
        If Not _Enabled Then Return Nothing '<- This fails
    End SUb
End Class

Но если бы я не использовал автореализовал свойство и объявил мое собственное поле поддержки следующим образом: это доступно из подкласса:

Private _Enabled as Boolean

---- РЕДАКТИРОВАТЬ ---- неверная строка abve - это невозможно,на самом деле это был Protected в исходном коде, который разрешал доступ из подкласса. См. @JonSkeet answer ---- EDIT ----

Конечно, я могу просто получить доступ к Enabled изподкласс, чтобы обойти это, но кто-то может объяснить, почему это поведение?

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Я почти уверен, что вы не сможете получить доступ к Приватному члену из подкласса. В любом случае, автоматически реализуемое свойство не создает вспомогательное поле, к которому вы можете получить доступ (в противном случае это будет точно так же, как обычные пользовательские свойства) ./

1 голос
/ 20 декабря 2011

Но если бы я не использовал автоматически реализованное свойство и объявил свое собственное поле поддержки следующим образом, это доступно из подкласса:

Private _Enabled as Boolean

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

Из документов для модификатора Private :

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

Лично я бы посчитал плохим доступ к полю поддержки автоматически реализуемого поля.свойство в любом случае напрямую - в C # оно даже недоступно, так как ему дается неописуемое имя (которое недопустимо в самом C #).Если вы хотите получить значение свойства из вашего производного класса, почему бы вам просто не обратиться к нему как свойство?Это был бы подходящий подход, даже если вы не использовали автоматически реализованные свойства - ваши поля должны быть закрытыми.

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