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

25. Свойства как механизм реализации инкапсуляции. Формат записи свойств.

Все объектно-ориентир.языки исп-т 3 базовых принципа объектно-ориентириентированного программирования: -инкапсуляция- как данный язык скрывает внутренние особенности реализации объектов; -наследование- как данный язык обеспечивает возможность многократного использования программного кода; -полиморфизм- как данный язык позволяет интерпретировать родственные объекты унифицированным способом(это перегрузка методов и конструкторов, переопределение методов). Одним из аспектов инкапсуляции является защита данных. Данные об объекте должны определяться как приватные (private). Это значит, что поля данных объекта (члены переменные класса) не должны быть непосредственно доступны из открытого интерфейса. Если пользователь объекта желает изменить сост.объекта, то он должен делать это косвенно, с помощью методов чтения (get()) и модификации (set()). Платформа .NET реализует принцип инкапсуляции на основе использования свойств. Свойства – специальный член класса, позволяющий получить доступ к полю данных об объекте. Для хранения свойств память не выдел. Свойства используются для инкапсуляции полей в классе, позволяя выполнять чтение и запись их значений. Свойство состоит из имени или двух блоков программного кода, называемых функциями доступа или аксессорами(для чтения - get(), для записи-set()). Имя свойства можно использовать в выражениях и в операторах присваивания как обычную переменную.

Формат записи св-в: public тип_св-ва Имя_св-ва {get { // оператор чтения поля } set {// операторы модифик.поля } }

Аксессор set автомат.принимает параметр value, кот.содержит значение, присваиваемое св-ву. Можно присваивать св-ва, предназн.только для чтения либо только для записи. Св-во не должно изменять состояние члена-перем.при вызове get-аксессоров, но компилятор не обнаружит изменения. Св-во нельзя передавать методу в качестве ref или out параметра. Св-ва нельзя перегружать. Можно создавать стат.св-во. Преим-ва св-в в том, что пользователи объекта получ.возм-сть изменять внутр.данные и использовать св-ва в выражениях.

26. Индексаторы. Специальные приемы построения типов. Создание одномерных и двумерных индексаторов.

В некот. ситуациях бывает удобно индексировать содержимое объекта так, словно он представляет собой массив. Индексация массивов реализуется с использованием оператора [ ]. Св-ва и индексаторы расширяют возм-сти класса. Свойства и индексаторы расширяют возможности класса. Св-ва предлагают эффект. способ управления доступом к данным экземпляра класса. Индексаторы обеспечивают механизм, посредством кот. к объектам можно получать доступ по индексам на основе синтаксиса массивов. Индексатор позволяет обеспечить индексированный доступ к объекту. Гл. назначение – создавать специализированные массивы, на кот. налагается одно или несколько ограничений. Индексаторы служат для доступа к классам, содержащим наборы похожих элементов. При работе с коллекциями доступ 1) к их содержимому осуществляется с помощью индексатора. С помощью индексатора можно также работать с коллекцией, как с обычным массивом. 2) привести примеры семейств из офисных пакетов. 3) при использовании индексаторов пользовательские типы коллекции лучше согласуются со структурой библиотек базовых классов .Net. Индексатор в С# представляет собой несколько “искаженное” свойство. Объявление индексаторов позволяет создать классы, имитирующие виртуальные массивы. Индексаторы могут характеризоваться одной или несколькими размерностями. Одномерные индексаторы. Формат записи: public Тип_возврата this[int index] { get { // возврат значения, заданного с пом.индекса } set { // установка значения, заданного с пом.индекса } } Объявление индексатора очень похоже на объявление св-ва. Оба аксессора в кач-ве параметра принимают индекс. Если индекс стоит слева от оператора присваивания, то вызывается аксессор set и устанавливается элемент, заданный параметром индекс. В противном случае вызывается аксессор get и возвращается значение, соответствующее параметру индекс. Индексаторы необязат.создавать с поддержкой как get- , так и set- аксессоров. Можно создать индексатор, предназначенный только для чтения (реализовав только get-аксессор) или только для записи (реализовав только set-аксессор). Индексаторы можно перегружать. Чаще всего индексатор перегружается, чтобы иметь возможность использовать объект класса в качестве индекса, значение которого вычисляется специальным образом. Индексаторы без использования базового массива. Индексатор может не использовать базовый массив. Вполне достаточно, чтобы индексатор обеспечивал функционирование, кот. для пользователя выглядело бы, как будто идет работа с массивом (виртуальный массив). Создание двумерного индексатора. Можно создавать и многомерные индексаторы. Задание 3: Добавить в проект Matrix класс bezop_mas2D, содержащий двумерный индексатор: class bezop_mas2D

{ int [,] mas; // ваше имя массива

int rows, cols; // ваши имена размерностей

public int dlina; // количество элементов в матрице

public bool errflag; //коструктор

public beop_mas2D(int r, int c)

{ rows = r; сols = c; mas = new int[rows, cols]; dlina = rows * cols; }

//Индексатор: public int this [int index1, int index2]

{ get { if(ok(index1, index2))

{ errflag = false; return mas[index1, index2]; }

else { errflug = true; return 0; } }

set { if(ok(index1, index2))

{ mas[index1, index2] = value; errflag = false; }

else errflag = true; }

private bool ok(int index1, int index2)

{ if(index1 >= 0 && index1 < rows && index2 >= 0 && index2 < cols)

return true;

return false; } ←// для индексатора }←// для класса

//Проверить работу класса в main():

bezop_mas2D mas2D = new bezop_mas2D(3,5);

Console.WriteLine(“Мягкое приземление при работе с матрицей”);

for (i = 0; i < 6; i++) mas2D[i, i] = I * 10;

Console.WriteLine(“Работа с уведомлением об ошибках”);

for(i = 0; i < 6; i++)

{ mas2D[i, i] = i * 10; If(mas2D.errflag)

Console.WriteLine(“mas2D[” + i + “,” + i + “] вне границ”); } Console.WriteLine();

Cоnsole.WriteLine(“Создана матрица”); for(i = 0; i < 6; i++) {x = mas2D[i, i];

if(!mas2D.errflag) Console.Write(x + “ ”);

else Console.WriteLine(“mas2D[” + i + “,” + i + “] вне границ”); } } }

Индексаторы и свойства применяются для разработки массивов ( в виде класса ), в которых границы индексов устанавливает пользователь, т.к. не всегда удобна индексация с нуля.