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

Индексаторы

Индексаторы позволяют индексировать экземпляры класса или структуры так же, как массивы. Индексаторы напоминают свойства, но их методы доступа принимают параметры.

Очень часто класс содержит некий набор объектов (массив, список). Для доступа к элементам этого набора необходимо реализовать два параметра: индекс элемента и значение. Для повышения удобства работы с такими классами были разработаны индексаторы. В случае их реализации в классе с объектной переменной можно работать как с массивом, т.е. после её идентификатора указывать индекс элемента, к которомe мы обращаемся для чтения или для записи.

Индексаторы определяться следующим образом:

[<атрибуты>] [<модификаторы>] <тип> this [<индекс>]

{

[get

{

}]

[set

{

}]

}

Индекс представляет собой список формальных параметров, описывающий индекс элементов, по которым осуществляется доступ к массиву по механизму, реализованному в классе.

Синтаксически объявление индексатора такое же, как и в случае свойств, но методы get и set приобретают аргументы по числу размерности массива, задающего индексы элемента, значение которого читается или обновляется. У класса может быть только один индексатор и у этого индексатора стандартное имя this. Так что если среди полей класса есть несколько массивов, то индексация объектов может быть выполнена только по одному из них.

Рассмотрим пример:

class Chair

{

string[] lesson=new string[5];

public string this[int i]

{

get

{

return lesson[i];

}

set

{

lesson[i] = value;

}

}

}

class Program

{

static void Main()

{

Chair C1 = new Chair();

C1[0] = "АЯ";

C1[1] = "Инфрматика";

C1[2] = "БД";

for (int i = 0; i < 3; i++)

Console.WriteLine(C1[i]);

Console.ReadLine();

}

}

В приведенном примере, создан класс Chair – описывающий кафедру. Поле lesson определяет предметы проводимые на кафедре. При помощи индексатора выполняется изменение и чтение поля lesson.

Этапы проектирования класса.

Перечислим основные вопросы, которые приходится решать при создании класса.

  1. Проектирование полей класса, сделав их закрытыми для клиентов.

  2. Проектирование стратегии доступа к закрытым полям класса, реализовав их в виде методов и свойств.

  3. Проектирование набора конструкторов класса.

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

Отношения между классами

Два основных типа отношений между классами это: вложенность (клиент - поставщик) и наследование (родитель - наследник).

Классы A и В находятся в отношении "клиент - поставщик", если одним из полей класса В является объект класса А. Класс А называется поставщиком класса В, класс В называется клиентом класса А.

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

При проектировании классов часто возникает вопрос, какое же отношение между классами нужно построить. Пусть классы Square и Rectangle, описывают квадраты и прямоугольники. Эти классы следует связать скорее отношением наследования, чем вложенности; менее понятным остается вопрос, а какой из этих двух классов следует сделать родительским. Классы Car и Person, описывают автомобили и человека. Какими отношениями с этими классами должен быть связан класс Person_of_Car, описывающий владельца машины? Может ли он быть наследником обоих классов? Найти правильные ответы на эти вопросы проектирования классов помогает понимание того, что отношение "клиент - поставщик" задает отношение "имеет" ("has"), а отношение наследования задает отношение "является" ("is a"). В случае классов Square и Rectangle понятно, что каждый объект квадрат "является" прямоугольником, поэтому между этими классами существует отношение наследования и родительским классом является класс Rectangle, а класс Square является его потомком.

В случае автомобилей, персон и владельцев авто также понятно, что владелец "имеет" автомобиль и "является" персоной. Поэтому класс Person_of_Car является клиентом класса Car и наследником класса Person