Защищенный доступ и исключение наследования 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Защищенный доступ и исключение наследования



Защищенный доступ и исключение наследования

 

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

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

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

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class MyClass

{

// Члены закрытые для класса Program

// но открытые для класса ClassA

protected int x, y, z;

}

 

class ClassA: MyClass

{

public ClassA(int x, int y, int z)

{

this.x = x;

this.y = y;

this.z = z;

}

// Данный метод использует защищенные члены класса MyClass

public double LongVector()

{

return Math.Sqrt(x * x + y * y + z * z);

}

}

 

class Program

{

static void Main()

{

ClassA obj = new ClassA(x: 12, y: 5, z: 6);

Console.WriteLine("Длина вектора равна: {0:#.##}", obj.LongVector());

Console.WriteLine("Для продолжения нажмите любую клавишу...");

Console.ReadKey();

}

}

}

 

Рис. 1. 1. Результат работы кода выше

 

В данном примере класс MyClass наследуется классом ClassA, а его члены x, y и z объявлены как protected, и поэтому они доступны для метода LongVector. Если бы члены x, y и z класса MyClass были объявлены как private, то они оказались бы недоступными для класса ClassA, и приведенный выше код нельзя было бы скомпилировать.

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

Хотя protected-поля данных могут нарушить инкапсуляцию, объявлять protected-методы достаточно безопасно (и полезно). При построении иерархий классов очень часто приходится определять набор методов, которые используются только производными типами.

Несмотря на всю свою полезность, защищённый доступ пригоден далеко не для всех ситуаций. Модификатор доступа protected следует применять в том случае, если требуется создать член класса, доступный для всей иерархии классов, но для остального кода он должен быть закрытым. А для управления доступом к значению члена класса лучше воспользоваться свойством.

 

Ключевое слово sealed

 

В С# поддерживается еще одно ключевое слово — sealed, которое исключает наследование. Если класс помечен как sealed (запечатанный), компилятор не позволяет наследовать от него. Ниже приведен пример объявления класса типа sealed:

 

sealed class А

{

//...

}

// Следующий класс недопустим

class В: А { // ОШИБКА! Наследовать класс А нельзя

//...

}

 

Как следует из комментариев в приведенном выше фрагменте кода, класс В не может наследовать класс А, потому что последний объявлен как sealed.

Чаще всего запечатывание имеет смысл при проектировании служебного класса. Например, в пространстве имён System определено множество запечатанных классов. В этом легко убедиться, открыв окно Object Browser («Обозреватель объектов»)в среде разработки Visual Studio 2010 (через меню View («Вид»)) и выбрав класс String, определенный в пространстве имён System внутри сборки mscorlib.dll:

 

Рис. 2. 1. Класс String в обозревателе объектов среде разработки Visual Studio 2010

 

Наиболее вероятная ситуация, когда может понадобиться пометить класс или метод как sealed — это когда класс или метод обеспечивает внутренние действия библиотеки,класса или других разрабатываемых классов, поэтому вы уверены, что любая попытка переопределить некоторую его функциональность приведет к нестабильности кода. Также можно помечать класс или метод как sealed из коммерческих соображений, чтобы предотвратить использование классов способом, противоречащим лицензионным соглашениям.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 315; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.145.114 (0.01 с.)