Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы по Технологии программирования / Доступ к членам класса и наследование

.docx
Скачиваний:
8
Добавлен:
21.05.2015
Размер:
7.16 Кб
Скачать

Наследование класса не отменяет ограничения, связанные с закрытым доступом. Таким образом, несмотря на то, что производный класс включает все члены базового класса, он не может получить доступ к тем из НИХ, которые объявлены закрытыми.

С#-программисты обычно предоставляют доступ к закрытым членам класса посредством открытых методов или путем превращения их в свойства.

Во многих случаях используют защищённые члены классов. Защищенным является член, который открыт для своей иерархии классов, но закрыт вне этой иерархии.

Защищенный член создается с помощью модификатора доступа protected. При объявлении protected-члена он, по сути, является закрытым, но с одним исключением. Это исключение вступает в силу, когда защищенный член наследуется. В этом случае защищенный член базового класса становится защищенным членом производного класса, а следовательно, и доступным для производного класса. Таким образом, используя модификатор доступа protected, можно создавать закрытые (для "внешнего мира") члены класса, но вместе с тем они будут наследоваться с возможностью доступа со стороны производных классов.

// Демонстрация использования защищенных членов класса.

usingSystem;

class В {

protectedint i, j; // Закрыт внутри класса В,

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

public void set(int a, int b) {

i = a;

j = b;

}

public void show() {

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

}}

classD : В {

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

// Класс D получаетдоступ к членам i и j класса В.

public void setk() {

k = i * j ;

}

public void showk() {

Console.WriteLine(k) ;

}}

classProtectedDemo {

public static void Main() {

D ob = new D();

ob.set(2, 3); // OK, так как D "видит" В-члены i и j .

ob.show(); // OK, так как D "видит" В-члены i и j .

ob.setk(); // OK, так как это часть самого класса D.

ob.showk(); // OK, так как это часть самого класса D.

}}

Поскольку в этом примере класс в наследуется классом D и члены i и j объявлены защищенными в классе В (т.е. с использованием модификатора доступа protected), метод setk() может получить к ним доступ. Если бы члены i и j были объявлены в классе в закрытыми, класс D не имел бы к ним права доступа, и программа не скомпилировалась бы.

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