* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна!
Защищенные члены
8 февраля 2009
С уровнями доступа к членам классов вы познакомились в главе 1: члены, объяв- ленные с уровнем доступа Public (public), доступны из любой части приложения, в том числе из внешних классов; члены с уровнем доступа Friend или internal доступ- ны только членам из локальной сборки, но не из внешних сборок; члены с уровнем доступа Private (private) доступны только в пределах класса и не доступны никаким другим классам, в том числе и производным от класса, в котором объявлен этот член. Остальные два уровня доступа, Protected (protected) и Protected Friend (protected internal), подробно не обсуждались в главе 1.
Области видимости членов классов, объявленных с ключевыми словами Protected (protected) и Private (private), совпадают за исключением того, что в первом случае члены доступны и производным классам. Рассмотрим следующий пример; Visual Basic .NET ' В базовом классе определены два метода: с уровнями доступа private и protected. Public Class BaseClass Метод с уровнем доступа private нельзя вызывать ' из производных классов.., Private Sub HethodK) Реализация опущена End Sub ...а метод с уровнем доступа protected из производных классов вызывать можно. Protected Sub Method2() Реализация опущена End Sub End Class ' Класс, производный от BaseClass Public Class InheritedClass Inherits BaseClass Public Sub OernoO 1 Такой вызов допустим, поскольку уровень доступа protected ' не запрещает доступ к члену, объявленному в BaseClass, Me.Method2() ' а этот вызов приведет к ошибке компиляции, поскольку он ' обращается к члену базового класса, объявленному ' с уровнем доступа private. Me.Method1() End Sub End Class Visual C# // В базовом классе определены два метода: // с уровнями доступа private и protected, public class BaseClass // Метод с уровнем доступа private нельзя вызывать // из производных классов... private void Method"! () // Реализация опущена // Класс, производный от BaseClass public class InheritedClass : BaseClass { public void Demo() { // Такой вызов допустим, поскольку уоовень доступа protected // не запрещает доступ к члену, обьявленному в BaseClass, this.Method2(); // а этот вызов приведет к ошибке компиляции, поскольку он // обращается к члену базового класса, объявленному // с уровнем доступа private. this. Hethod1(); Здесь иллюстрируется различие закрытых и защищенных членов. Метод Demo попытается вызвать методы Method! и Melhod2 при помощи ссылки на экземпляр класса InheritedClass (через ключевое слово Me [this]). Поскольку оба этих метода определены в базовом классе, возможность их вызова определяется уровнями досту- па, с которыми они объявлены. Вызов метода Method2 завершается успешно, так как он объявлен с модификатором Protected (protected), а метод Method!, объявлен- ный с модификатором Private (private), производным классам не доступен. Уровень доступа Protected Friend (protected internal) представляет собой «гибрид*- модификаторов Protected (protected) и Friend (internal). Поэтому член класса, объяв- ленный с модификатором Protected Friend (protected internal), доступен членам этого класса и других классов, расположенных в той же сборке с этим классом, а также членам своих производных классов.