- •Глава 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
Interface iBase
{
void write();
}
interface IN1 : IBase { }
interface IN2 : IBase { }
interface INt : IN1, IN2 {}
class Class : INt
{
public void write() { /* операторы метода */ }
}
class Program
{
public static void Main() { }
}
Два интерфейса IN1 и IN2 построены на базе интерфейса IBase. У интерфейса
INt базовыми являются IN1 и IN2. Класс с именем Class реализует интерфейс INt и
тем самым должен реализовать и все остальные интерфейсы. Самое важное – тот
факт, что класс получает для реализации только один экземпляр члена write().
Несмотря на то, что write() как член базового класса наследуется двумя
интерфейсами IN1 и IN2, но в интерфейс INt он входит только один раз и только
один раз должен быть реализован в классе Class. Сказанное иллюстрирует (см. рис.
14.4) диаграмма классов программы.
Рис 14.4. Множественное наследование интерфейсов в программе 14_07.cs
При построении иерархии интерфейсов возможно совпадение имён и сигнатур
членов разных интерфейсов. Если сигнатуры методов не совпадают, то есть
прототипы методов интерфейсов заведомо разные, то ничего предпринимать не
нужно – класс должен реализовать все одноимённые члены, имеющие разные
сигнатуры. В случае совпадения сигнатур член производного интерфейса
экранирует
"экранирует:скрывает"
(скрывает) одноимённый член базового
интерфейса. В этом случае компилятор потребует подтверждения правильности
экранирования. Для этого член производного интерфейса нужно снабдить
модификатором new "модификатор: new" . При экранировании класс не должен
реализовать член базового интерфейса (достаточно реализации экранирующего
члена производного интерфейса).
Следующая программа иллюстрирует приведённые правила:
// 14_08.cs - множественное наследование интерфейсов
using System;
Interface iBase {
void write();
}
interface IN1 : IBase {
new void write();
}
interface IN2 : IBase {
int write(int r);
}
interface INt : IN1, IN2 {}
class Class : INt {
public void write()
{ Console.WriteLine("IN1"); }
public int write(int r)
{ Console.WriteLine("IN2 "+r); return 1; }
}
class Progra
m
{
public static void Main() {
Class dot = new Class();
dot.write();
dot.write(23);
}
}
Результаты выполнения программы:
IN1
IN2 23
В базовом интерфейсе IBase
есть прототип метода write(). В производных
интерфейсах IN1, IN2 декларированы одноимённые методы с разной сигнатурой.
Прототип метода из IN1 экранирует прототип метода базового интерфейса.
Прототип метода из IN2 существует независимо от других одноимённых
прототипов. Класс Class, реазующий всю иерархию интерфейсов, реализует как
перегруженные (overloaded) два метода, декларированные в интерфейсах IN1, IN2.
Результаты выполнения программ и диаграмма классов и интерфейсов (рис. 14.5)
дополняют приведённые объяснения. Обратите внимание на обозначение метода
write() в изображении класса Class. В подписи указано, что существует две
реализации: (+1 overloaded).
Рис 14.5. Множественное наследование интерфейсов с перегрузкой и
экранированием членов интерфейсов
Контрольные вопросы
Что такое наследование реализации?
Что такое наследование специфицированной функциональности?
Какие механизмы C# обеспечивают реализацию наследования специфицированной
функциональности?
Что такое интерфейс?
Какие объявления могут входить в декларацию интерфейса?
В чём отличия интерфейса от класса?
Как проявляется принцип полиформизма при использовании интерфейсов.
Что такое прототип метода и где прототипы используются?
Назовите правила реализации классом интерфейса.
Что такое принцип подстановки Лискова
?
Можно ли объявить интерфейс с модификатором static?
Что такое спецификация базы интерфейса?
Какие модификаторы допустимы для члена интерфейса?
Какой статус доступа имеют члены интерфейса?
Приведите формат объявления свойства в интерфейсе.
Какие поля допустимы в объявлении интерфейса?
В чём различия прототипа метода в абстрактном классе от прототипа метода в
интерфейсе?
В чём различия и сходства интерфейса и абстрактного класса?
Что такое реализация члена интерфейса?
Является ли интерфейс типом?
К какому виду типов относится интерфейс?
Доступ к каким членам класса, реализующего интерфейс, обеспечивает ссылка с
типом интерфейса?
Как с помощью интерфейсов обеспечивается динамическое связывание?
Что такое наследование интерфейсов?
