- •Предисловие
- •Объектная ориентация программ на C#
- •1.1. Типы, классы, объекты
- •1.2. Программа на C#
- •1.3. Пространство имен
- •1.4. Создание консольного приложения
- •Типы в языке C#
- •2.1. Типы ссылок и типы значений
- •2.2. Классификация типов C#
- •2.3. Простые типы. Константы-литералы
- •2.4. Объявления переменных и констант базовых типов
- •Операции и целочисленные выражения
- •3.1. Операции языка C#
- •3.2. Операции присваивания и оператор присваивания
- •3.3. Операции инкремента (++) и декремента (--)
- •3.4. Выражения с арифметическими операциями
- •3.5. Поразрядные операции
- •Выражения с операндами базовых типов
- •4.1. Автоматическое и явное приведение арифметических типов
- •4.2. Особые ситуации в арифметических выражениях
- •4.3. Логический тип и логические выражения
- •4.4. Выражения с символьными операндами
- •5.2. Простые (базовые) типы C# как классы
- •Операторы
- •6.1. Общие сведения об операторах
- •6.2. Метки и оператор безусловного перехода
- •6.4. Операторы цикла
- •6.5. Операторы передачи управления
- •6.6. Переключатель
- •Массивы
- •7.1. Одномерные массивы
- •7.2. Массивы как наследники класса Array
- •7.3. Виды массивов и массивы многомерные
- •7.5. Массивы массивов и поверхностное копирование
- •Строки – объекты класса string
- •8.1. Строковые литералы
- •8.2. Строковые объекты и ссылки типа string
- •8.3. Операции над строками
- •8.5. Форматирование строк
- •8.6. Строка как контейнер
- •8.7. Применение строк в переключателях
- •8.8. Массивы строк
- •8.8. Сравнение строк
- •8.10. Аргументы метода Main()
- •Методы C#
- •9.2. Соотношение фиксированных параметров и аргументов
- •9.3. Параметры с типами ссылок
- •9.4. Методы с переменным числом аргументов
- •9.5. Перегрузка методов
- •9.6. Рекурсивные методы
- •9.7. Применение метода Array.Sort()
- •Класс как совокупность статических членов
- •10.1. Статические члены класса
- •10.2. Поля классов (статические поля)
- •10.3. Статические константы
- •10.4. Статические методы
- •10.5. Статический конструктор
- •10.6. Статические классы
- •Классы как типы
- •11.1. Объявление класса
- •11.2. Поля объектов
- •11.3. Объявления методов объектов
- •11.4. Пример класса и его объектов
- •11.5. Ссылка this
- •11.6. Конструкторы объектов класса
- •11.7. Деструкторы и финализаторы
- •Средства взаимодействия с объектами
- •12.1. Принцип инкапсуляции и методы объектов
- •12.2. Свойства классов
- •12.3. Автореализуемые свойства
- •12.4. Индексаторы
- •12.5. Индексаторы, имитирующие наличие контейнера
- •Включение, вложение и наследование классов
- •13.1. Включение объектов классов
- •13.2. Вложение классов
- •13.3. Наследование классов
- •13.4. Доступность членов класса при наследовании
- •13.5. Методы при наследовании
- •13.6. Абстрактные методы и абстрактные классы
- •13.7. Опечатанные классы и методы
- •13.8. Применение абстрактых классов
- •Интерфейсы
- •14.1. Два вида наследования в ООП
- •14.2. Объявления интерфейсов
- •14.3. Реализация интерфейсов
- •14.4. Интерфейс как тип
- •14.5. Интерфейсы и наследование
- •Перечисления и структуры
- •15.1. Перечисления
- •15.2. Базовый класс перечислений
- •15.3. Структуры
- •15.4. Упаковка и распаковка
- •15.5. Реализация структурами интерфейсов
- •Исключения
- •16.1. О механизме исключений
- •16.3. Свойства исключений
- •16.5. Исключения в арифметических выражениях
- •16.6. Генерация исключений
- •16.7. Пользовательские классы исключений
- •Делегаты и события
- •17.1. Синтаксис делегатов
- •17.2. Массивы делегатов
- •17.3. Многоадресные групповые экземпляры делегатов
- •17.4. Делегаты и обратные вызовы
- •17.5. Анонимные методы
- •17.6. События
- •Литература
- •Предметный указатель
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.Какой тип допустим для параметра индексатора?