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

7 Инкапсуляция. Свойства. Функциональное назначение. Реализация. Создание индексатора. Примеры применения.

. Инкапсуляция — это механизм, объединяющий данные и обрабатывающий их код как единое целое. Инкапсуляцией называется включение различных мелких элементов в более крупный объект, в результате чего программист работает непосредственно с этим объектом. Это приводит к упрощению программы, поскольку из нее исключаются второстепенные детали. Инкапсуляцию можно сравнивать с работой автомобиля с точки зрения типичного водителя. Многие водители не разбираются в устройстве авто, но управляют им. Существует специальный интерфейс, который упрощает сложные операции работы двигателя, тормоза. Сказанное относится к инкапсуляции и ООП — многие подробности внутреннего устройства скрываются от пользователя, что позволяет ему сосредоточиться на решении конкретных задач. В ООП эта возможность обеспечивается классами, объектами и различными средствами выражения связей между ними.

Индексатор представляет собой разновидность свойства. Если какой-то член класса оформлен в виде массива, с помощь средств языка можно создать для этого члена индексатор, позволяющий обращаться к отдельным элементам массива как к элементам массива — с помощью квадратных скобок. Синтаксис индексатора:

спецификатор тип this [список_параметров]

{ get код_доступа

set код_доступа }

Список_параметров содержит одно или несколько описаний индексов, по которым выполняется доступ к элементу. Чаще всего используется один индекс целого типа. Код_доступа представляют собой блоки операторов, которые выполняются при получении (get) или установки (set) элемента массива. Пример:

const int Child_Max = 20; //максимальное число детей (константа)

Person[] children = new Person[Child_Max];

int count_children=0; //число детей

public Person this[int i] //индексатор с именем this

{

get {if (i>=0 && i< count_children)return(children[i]);

else return(children[0]);}

set

{

if (i==count_children && i< Child_Max)

{children[i] = value; count_children++;}

}

}

Имя у индексатора — this, в квадратных скобках в заголовке перечисляются индексы. В методах get и set, обеспечивающих доступ к массиву children, по которому ведется индексирование, анализируется корректность задания индекса. Закрытое поле count_children, хранящее текущее число детей, доступно только для чтения благодаря добавлению соответствующего метода-свойства. Запись в это поле происходит в методе set индексатора, когда к массиву children добавляется новый элемент.

8.Инкапсуляция. Скрытие членов класса. Функциональное назначение. Реализация. Примеры применения.

Управление доступом к членам класса достигается за счет использования четырех спецификаторов доступа: public, private, protected и internal. Модификатор protected применяется только при включении интерфейсов. Модификатор internal применяется в основном при использовании компоновочных файлов (assembly). Если некоторые методы класса A должны быть доступны для вызовов в методах класса B, являющегося потомком класса A, то такие методы следует снабдить атрибутом protected. Если некоторые методы должны быть доступны только для методов классов B1, B2 и так далее, дружественных по отношению к классу A, то такие методы следует снабдить атрибутом internal, а все дружественные классы B поместить в один проект. Назначение модификатора internal — заявить о том, что некоторый член известен во всех файлах, входящих в состав компоновочного, но неизвестен вне его. Проще говоря, член, отмеченный модификатором internal, известен только программе, но не где-то еще. Модификатор доступа internal чрезвычайно полезен при создании программных компонентов. Модификатор internal можно применить к классам и членам классов, а также к структурам и членам структур.

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

Общие принципы использования спецификаторов доступа public и private:

1. Члены, которые используются только внутри класса, следует определить как закрытые.

2. Данные экземпляров, которые должны находиться в пределах заданного диапазона, следует определить как закрытые, а доступ к ним обеспечить через открытые методы, выполняющие проверку вхождения в диапазон.

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

4. Члены, при некорректном использовании которых на объект может быть оказано негативное воздействие, следует определить как закрытые, а доступ к ним обеспечить через открытые методы, предохраняющие эти члены от некорректного использования.

5. Методы, которые получают или устанавливают значения закрытых данных, должны быть открытыми.

6. Объявление переменных экземпляров открытыми допустимо, если нет причин делать их закрытыми.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]