
- •Глава 10, описывающая классы как контейнеры их статических членов,
- •Глава 13 посвящена отношениям между классами (и их объектами). Особое
- •Глава 18 включена в книгу при подготовке второго издания. Она посвящен
- •Глава 1. Объектная ориентация программ
- •1.1. Типы, классы, объекты
- •1.2. Программа на c#
- •1.3. Пространство имен
- •1.4. Создание консольного приложения
- •Глава 2. Типы в языке c#
- •2.1. Типы ссылок и типы значений
- •2.2. Классификация типов c#
- •2.3. Простые типы. Константы-литерал
- •2.4. Объявления переменных и констант базовых типо
- •If implicit in int interface
- •Internal is lock long namespace
- •Volatile while
- •Глава 3. Операции и целочисленные выражения
- •3.1. Операции языка c#
- •3.2. Операции присваивания и оператор
- •3.4. Выражения с арифметическими операциями
- •3.6. Переполнения при операциях с целыми
- •Глава 4. Выражения с операндами базовых
- •4.1. Автоматическое и явное приведение арифметических типов
- •4.2. Особые ситуации в арифметических выражениях
- •4.3. Логический тип и логические выражения
- •4.4. Выражения с символьными операндами
- •4.5. Тернарная (условная) операция
- •Глава 5. Типы с# как классы платформы .Net
- •5.1. Платформа .Net Framework и спецификация cts
- •5.2. Простые (базовые) типы c# как классы
- •5.3. Специфические методы и поля простых типов
- •Глава 6. Операторы
- •6.1. Общие сведения об операторах
- •6.2. Метки и оператор безусловного перехода
- •6.3. Условный оператор (ветвлений)
- •If (логическое выражение) оператор_1
- •6.4. Операторы цикла
- •6.5. Операторы передачи управления
- •If (условие) break;
- •6.6. Переключатель
- •Int ball; // оценка в баллах:
- •Глава 7. Массивы
- •7.1. Одномерные массивы
- •Int [ ] integers
- •Int number;
- •7.2. Массивы как наследники класса Array
- •7.3. Виды массивов и массивы многомерные
- •Int [,] dots;
- •Int size;
- •7.4. Массивы массивов и непрямоугольные массивы
- •Int size;
- •7.5. Массивы массивов и поверхностное копирование
- •Int size;
- •Int size;
- •Глава 8. Строки – объекты класса string
- •8.1. Строковые литералы
- •8.2. Строковые объекты и ссылки типа string
- •242.ToString()
- •8.3. Операции над строками
- •8.4. Некоторые методы и свойства класса String
- •8.5. Форматирование строк
- •8.6. Строка как контейне
- •8.7. Применение строк в переключателях
- •8.8. Массивы строк
- •8.8. Сравнение строк
- •Int static Compare (string, string)
- •Int static Compare (string, string, Boolean,CultureInfo)
- •If (string.Compare(res, hen, true,
- •8.9. Преобразования с участием строкового типа
- •38 Попугаев.
- •8.10. Аргументы метода Main( )
- •8.11. Неизменяемость объектов класса String
- •Глава 9. Методы c#
- •9.1. Методы–процедуры и методы-функции
- •9.2. Соотношение фиксированных параметров и аргументов
- •Int iPart;
- •9.3. Параметры с типами ссылок
- •Int[ ] temp;
- •Int[ ] temp;
- •9.4. Методы с переменным числом аргументов
- •VarParams(a, b, c);
- •9.5. Перегрузка методов
- •9.6. Рекурсивные методы
- •4*Fact (3); {
- •9.7. Применение метода Array.Sort()
- •Int имя_функции(тип параметр_1, тип параметр_2)
- •If(условие 2) return -1; // порядок соблюдён
- •Глава 10. Класс как совокупность статических
- •10.1. Статические члены класса
- •10.2. Поля классов (статические поля)
- •Int X; // поле объектов класса
- •10.3. Статические константы
- •10.4. Статические методы
- •10.5. Статический конструктор
- •10.6. Статические классы
- •Глава 11. Классы как типы
- •11.1. Объявление класса
- •11.2. Поля объектов
- •11.3. Объявления методов объектов
- •11.4. Пример класса и его объектов
- •Int count; // текущее показание
- •1 ' Counter.Count' is inaccessible due to its protection leve
- •11.5. Ссылка this
- •Int numb;
- •11.6. Конструкторы объектов класса
- •Int p; // порядок - инициализация по умолчанию
- •Void reduce() // Приведение числа к каноническому виду.
- •11.7. Деструкторы и финализаторы
- •Глава 12. Средства взаимодействия с объектами
- •12.1. Принцип инкапсуляции и методы объектов
- •12.2. Свойства классов
- •Internal, private, static, virtual, sealed, override, abstract, extern
- •Internal protected
- •Int p; // инициализация по умолчанию
- •Void reduce() // "Внутренний" для класса метод
- •12.3. Автореализуемые свойств
- •12.4. Индексаторы
- •Int[] days; // часы по дням недели
- •Int search(string str) { // поиск слова
- •12.5. Индексаторы, имитирующие наличие контейнера
- •Глава 13. Включение, вложение и наследование
- •13.1. Включение объектов классов
- •13.2. Вложение классов
- •13.3. Наследование классов
- •13.4. Доступность членов класса при наследовании
- •13.5. Методы при наследовании
- •13.6. Абстрактные методы и абстрактные классы
- •13.7. Опечатанные классы и методы
- •13.8. Применение абстрактых классов
- •Глава 14. Интерфейсы
- •14.1. Два вида наследования в ооп
- •14.2. Объявления интерфейсов
- •Interface имя_интерфейса
- •Interface iPublication { // интерфейс публикаций
- •Void write(); // готовить публикацию
- •Void read(); // читать публикацию
- •14.3. Реализация интерфейсов
- •Interface iPublication { // интерфейс публикаций
- •Void write(); // готовить публикацию
- •Void read(); // читать публикацию
- •Interface iSeries {
- •Void setBegin(); // восстановить начальное состояние
- •Int GetNext { get; } // вернуть очередной член ряда
- •Int this[int k] {get;} // вернуть к-й член ряда
- •Interface iSeries // интерфейс числовых рядов
- •14.4. Интерфейс как ти
- •Interface iGeo { // интерфейс геометрической фигуры
- •Void transform(double coef); // преобразовать размеры
- •Void display(); // вывести характеристики
- •Interface iGeo {
- •Void transform(double coef); // преобразовать размеры
- •Void display(); // вывести характеристики
- •Ira.Transform(3);
- •Ira.Transform(3);
- •14.5. Интерфейсы и наследование
- •Interface iPublication // интерфейс публикаций
- •Interface iBase
- •Interface iBase {
- •Глава 15. Перечисления и структуры
- •15.1. Перечисления
- •15.2. Базовый класс перечислений
- •IsDe fined"
- •15.3. Структуры
- •15.4. Упаковка и распаковка
- •If (obj is Struct1)
- •If (ob is PointS)
- •If (ob is Double)
- •15.5. Реализация структурами интерфейсов
- •Interface iShape {
- •Interface iShape
- •Information(ci);
- •Information(sp);
- •Interface iImage {
- •Void display();
- •Interface iImage
- •Void display();
- •Глава 16. Исключения
- •16.1. О механизме исключений
- •16.3. Свойства исключений
- •16.4. Управление программой с помощью исключений
- •X; // Вводимое число.
- •16.5. Исключения в арифметических выражениях
- •16.6. Генерация исключений
- •If (!double.TryParse(input, out u))
- •If (!double.TryParse(input, out u)
- •16.7. Пользовательские классы исключений
- •Глава 17. Делегаты и события
- •17.1. Синтаксис делегатов
- •17.2. Массивы делегатов
- •Int X, y; // положение робота на плоскости
- •17.3. Многоадресные (групповые) экземпляры делегатов
- •Virtual
- •17.4. Делегаты и обратные вызовы
- •17.5. Анонимные методы
- •17.6. События
- •Int size; // размер массива
- •Int[ ] ar; // ссылка на массив
- •Int temp;
- •Глава 18. Обобщения
- •18.1. Обобщения как средство абстракции
- •18.2. Декларации обобщённых классов "декларация
- •18.3. Ограничения типизирующих параметров
- •Intemface iComparable {
- •Int CompareTo (object p);
- •18.4. Обобщённые структуры "обобщённые структуры"
- •18.5. Обобщённые интерфейсы "обобщённый интерфейс"
- •Int add(t X, t y); // прототип метода
- •18.6. Обобщённые методы "обобщённые методы"
- •18.7. Обобщённые делегаты "обобщённые делегаты"
- •Virtual
- •InnerException
- •Interface
Глава 18. Обобщения
18.1. Обобщения как средство абстракции
Код, записанный на каком-либо языке программирования, представляет собой
наиболее детализированное и поэтому в общем случае сложное представление
алгоритма, выбранного для решения конкретной задачи. Сложность кода
объясняется тем обстоятельством, что в нём должны быть учтены все детали
реализации алгоритма с помощью применяемого языка и ограничения той
операционной среды, в которой должна выполняться программа. Сложность кода и
трудоёмкость его разработки делают задачи его повторного использования и
автоматизации его генерации весьма важными и актуальными. В предыдущих главах
рассмотрены средства, позволяющие программировать на основе объектно-
ориентированного подхода. Этот подход позволяет создавать отдельные классы и
библиотеки
классов,
пригодные
для
повторных
использований.
Применяя
библиотеку классов, можно существенно снизить трудоёмкость разработки
программ, абстрагируясь от деталей кода, скрытых (инкапсулируемых) в
используемых объектах библиотечных классов.
Следующий уровень абстракции – параметризация
"параметризация:типов"
объявлений типов (например, классов) и методов
"параметризация:методов" .
Прежде чем переходить к описанию этого механизма (реализованного в языке C# с
помощью обобщений) поясним на примере его основные принципы.
Предположим, что для дальнейшего применения необходимо иметь класс,
объект которого представляет собой отдельный элемент связного списка, каждый из
которых хранит значения типа int.
class ListInt {
public int data;
public ListInt (int d)
{ data = d;}
…
}
Если в дальнейшем потребуется класс элементов связного списка, объекты
которого хранят значения типа char, то придётся объявлять его, например, так:
class ListChar {
public char data;
public ListInt (char d)
{ data = d;}
…
}
По структуре класс ListInt и ListChar подобны, единственное отличие – типы
полей data и типы параметров конструкторов в одном случае int, а во втором char.
Этот факт, а именно различие классов только в обозначениях типов, делает
возможным создание обобщённого (параметризованного) класса, который будет
служить шаблоном для автоматической генерации его частных случаев – классов с
полями типов int, char, а при необходимости long, double и т.д.
В языке C# такой механизм автоматизированной генерации кодов конкретных
объявлений
существует .
Определения
( объявления )
классов ,
структур ,
интерфейсов, делегатов и методов могут быть параметризованы типами тех данных,
которые представлены этими конструкциями или обрабатываются с их помощью. О
такой возможности параметризации объявлений говорят, используя термин
"обобщения". "обобщения" Механизм обобщений языка C# схож с механизмом
шаблонов (templates) классов и функций языка С++. Кроме того, как указывает
стандарт C#, обобщения хорошо знакомы программистам, владеющим языками
Эффель или Ада. Отметим, что в русскоязычной литературе, посвящённой языкам
Эффель и Ада обобщённые (generic) методы называют родовыми подпрограммами,
а об обобщённом программировании говорят как о родовом программировании.
Параметризованные
объявления
классов
и
структур
называют
,
соответственно, объявлениями обобщённых классов
"объявления:обобщённых
классов"
(generic class declaration) и объявлениями обобщённых структур
"объявления:обобщённых структур"
(generic struct declaration).
И классы
и
структуры в этих случаях параметризованы типами своих данных и типами тех
данных, которые должны обрабатываться методами этих классов и структур.
Интерфейсы
могут
быть
параметризованы
типами
тех
данных,
которые
обрабатываются методами интерфейсов после их реализации. Объявления таких
параметризованных
интерфейсов
называют
объявлениями
обобщённых
интерфейсов
"объявления:обобщённых
интерфейсов"
(generic
interface
declaration). Для того, чтобы создавать "обобщённые алгоритмы" выполняют
параметризацию
методов
типами
применяемых
в
них
данных .
Такие
параметризованные методы называют обобщёнными методами
"обобщённые
методы" ( g e n e r i c
methods).
В
объявлении
обобщённого
делегата
"объявления:обобщённых делегатов" типизирующие параметры определяют типы
параметров и тип возвращаемого значения тех методов, которые должны
представлять экземпляры делегата.