Инкапсуляция — один из столпов объектно-ориентированного программирования, она достигается с помощью модификаторов доступа, таких как Private и Protected. В классических версиях Visual Basic поддерживались только простейшие уровни видимости, но с переходом на VB.NET появились современные механизмы, аналогичные C#.
Основная задача — изолировать внутренние детали реализации от внешнего кода, в том числе, от других частей программы. Типичные ошибки связаны с неверным уровнем доступа, попытками обращаться к полям и методам вне разрешённой области видимости или неправильным пониманием поведения Protected и его сочетаний с другими модификаторами.
Поддерживаются следующие модификаторы:
Private — доступ только внутри текущего класса/модуляProtected — доступ внутри текущего класса и всех наследников (даже из других сборок)Friend — доступ внутри одной сборкиProtected Friend — доступ внутри наследников или внутри сборкиПример кода:
Public Class BaseClass Private Sub PrivateMethod() Console.WriteLine("PrivateMethod") End Sub Protected Sub ProtectedMethod() Console.WriteLine("ProtectedMethod") End Sub Friend Sub FriendMethod() Console.WriteLine("FriendMethod") End Sub Protected Friend Sub ProtectedFriendMethod() Console.WriteLine("ProtectedFriendMethod") End Sub End Class Public Class DerivedClass Inherits BaseClass Public Sub AccessMethods() 'PrivateMethod() 'Ошибка компиляции ProtectedMethod() 'Ок FriendMethod() 'Ок, если в одной сборке ProtectedFriendMethod() 'Ок End Sub End Class
Ключевые особенности:
Private ограничивает область видимости пределами классаProtected работает во всех унаследованных классах в любых сборкахProtected Friend объединяет оба правилаМожно ли получить доступ к private-полю из производного класса?
Нет, private-члены всегда доступны только в том классе, где они объявлены. Производный класс не имеет доступа к private-членам даже через рефлексию (если не использовать нестандартные способы).
Чем отличается Protected от Protected Friend?
Protected — доступен только из класса и его потомков, даже в других сборках; Protected Friend — доступен либо из производных классов, либо из любого кода внутри той же сборки.
Можно ли обратиться к protected-методу класса через экземпляр базового класса?
Нет, даже если protected-метод публично виден внутри наследника, нельзя вызвать его у экземпляра базового класса из внешнего кода. Protected-методы доступны только в теле самого класса или наследника.
Разработчик для упрощения тестирования делает внутренние поля public, чтобы обращаться к ним напрямую из внешнего кода или Unit-тестов. С течением времени другие вызовы начинают использовать эти поля, полагаясь на их внутреннюю структуру.
Плюсы:
Минусы:
Чётко применяются modификаторы доступа, все поля по умолчанию private, доступ извне только через свойства и публичные методы. Для нужд тестирования используются интерфейсы или классы-друзья в одной сборке.
Плюсы:
Минусы: