Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Наследование.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
135.39 Кб
Скачать

11.2.1 Организация защищенного доступа

Как пояснялось выше, открытый член базового класса недоступен для производно­го класса. Из этого можно предположить, что для доступа к некоторому члену базо­вого класса из производного класса этот член необходимо сделать открытым. Но если сделать член класса открытым, то он станет доступным для всего кода, что далеко не всегда желательно. Правда, упомянутое предположение верно лишь отчасти, посколь­ку в С# допускается создание защищенного члена класса. Защищенный член является открытым в пределах иерархии классов, но закрытым за пределами этой иерархии.

Защищенный член создается с помощью модификатора доступа protected. Если член класса объявляется как protected, он становится закрытым, но за исключением одного случая, когда защищенный член наследуется. В этом случае защищенный член базового класса становится защищенным членом производного класса, а значит, до­ступным для производного класса. Таким образом, используя модификатор доступа protected, можно создать члены класса, являющиеся закрытыми для своего класса, но все же наследуемыми и доступными для производного класса.

Ниже приведен простой пример применения модификатора доступа protected.

Листинг 11.6

// Продемонстрировать применение модификатора доступа protected.

using System;

class B

{

protected int i, j; // члены, закрытые для класса B,

// но доступные для класса D

public void Set(int a, int b)

{

i = a;

j = b;

}

public void Show()

{

Console.WriteLine(i + " " + j);

}

}

class D : B

{

int k; // закрытый член

// члены i и j класса B доступны для класса D

public void Setk()

{

k = i * j;

}

public void Showk() {

Console.WriteLine(k);

}

}

class ProtectedDemo

{

static void Main()

{

D ob = new D();

ob.Set(2, 3); // допустимо, поскольку доступно для класса D

ob.Show(); // допустимо, поскольку доступно для класса D

ob.Setk(); // допустимо, поскольку входит в класс D

ob.Showk(); // допустимо, поскольку входит в класс D

}

}

В данном примере класс В наследуется классом D, а его члены i и j объявлены как protected, и поэтому они доступны для метода Setk(). Если бы члены i и j класса В были объявлены как private, то они оказались бы недоступными для класса D, и при­веденный выше код нельзя было бы скомпилировать.

Аналогично состоянию public и private, состояние protected сохраняется за членом класса независимо от количества уровней наследования. Поэтому когда про­изводный класс используется в качестве базового для другого производного класса, лю­бой защищенный член исходного базового класса, наследуемый первым производным классом, наследуется как защищенный и вторым производным классом.

Несмотря на всю свою полезность, защищенный доступ пригоден далеко не для всех ситуаций. Так, в классе TwoDShape из приведенного ранее примера требовалось, чтобы значения его членов Width и Height были доступными открыто, поскольку нужно было управлять значениями, которые им присваивались, что было бы невоз­можно, если бы они были объявлены как protected. В данном случае более подходя­щим решением оказалось применение свойств, чтобы управлять доступом, а не пре­дотвращать его. Таким образом, модификатор доступа protected следует применять в том случае, если требуется создать член класса, доступный для всей иерархии клас­сов, но для остального кода он должен быть закрытым. А для управления доступом к значению члена класса лучше воспользоваться свойством.