Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Podbelsky_V_V_C_Bazovy_kurs.pdf
Скачиваний:
69
Добавлен:
02.06.2015
Размер:
1.73 Mб
Скачать

234

Г л а в а 1 2

 

 

Результат выполнения программы:

number["one"]: один number["three"]: Слова Нет! number["two"]: 2

12.5. Индексаторы, имитирующие наличие контейнера

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

В качестве примера рассмотрим класс, представляющий две температурные шкалы. Температура To по абсолютной шкале, введенной Вильямом Томсоном (лордом Кельвиным), связана с температурой to по шкале Цельсия соотношением:

To = to + 273.16o.

Определим класс Temperature с индексатором, позволяющий получать значение To по величине to, которую будет задавать параметр индексатора. Так как температура по Кельвину не может быть отрицательной, то примем, что при to < -273.16o индексатор будет возвращать значение -1. (Программа 12_06. cs.):

class Temperature

{ // Температура по Кельвину и по Цельсию. public double this[double t] {

get { return (t < -273.16) ? -1 : t + 273.16; }

}

}

В классе нет массива, и поэтому нет смысла в индексаторе определять аксессор set. В отличие от предыдущих примеров параметр индексатора и возвращаемое им значение имеют тип double. Конструктор задается неявно. Применение индексатора иллюстрирует следующий фрагмент кода:

Средства взаимодействия с объектами

235

 

 

static void Main()

{

Temperature TK = new Temperature(); double t=43;

Console.WriteLine("TK[{0}] = {1:f2}", t, TK[t]); t = -400;

Console.WriteLine("TK[{0}] = {1:f2}", t, TK[t]); t = -273;

Console.WriteLine("TK[{0}] = {1:f2}", t, TK[t]);

}

Результат выполнения:

TK[43] = 316,16

TK[-400] = -1,00

TK[-273] = 0,16

Контрольные вопросы

1.Объясните принципы инкапсуляции и ее применения к классам.

2.Опишите графическое изображение класса в UML.

3.В чем отличия свойств от полей?

4.Приведите формат объявления свойства.

5.Что такое тип свойства?

6.Что такое тело аксессора в объявлении свойства?

7.Каким идентификатором представлено в set-аксессоре новое значение свойства?

8.Объясните назначение механизма автореализуемых свойств.

9.Что такое скрытые поля?

10.Объясните роль служебного слова this в индексаторе.

11.Может ли в одном классе быть несколько индексаторов?

12.Какой тип допустим для параметра индексатора?

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