- •Глава 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
13.3. Наследование классов
Наиболее
богатым
в
отношении
повторного
использования
кода
и
полиморфизма является отношение наследования классов
"класс: наследование
классов" . Для него используют название "является" (is-a). При наследовании объект
производного класса служит частным случаем или специализацией объекта
базового класса. Например, велосипед является частным случаем транспортного
средства. Не проводя сравнительного анализа всех тонкостей возможных
отношений между классами (этим нужно заниматься в специальном курсе
,
посвященном объектно-ориентированной методологии, см., например, [3]), покажем
на примере рассматриваемых классов "точка на плоскости" и "окружность с
заданным точкой центром" как реализуется наследование в языке C#. Итак класс
Point будет базовым классом "класс: базовый класс" , а класс Circle сделаем его
наследником иначе говоря, производным "класс: производный базовый класс" от
него.
Для объявления класса, который является наследником некоторого базового
класса, используется следующий синтаксис:
модификаторыopt class имя_производного_класса
:имя_базового_класса
{операторы_тела_производного_класса}
Конструкция
: имя _ базового _ класса
в
стандарте
C#
называется
спецификацией базы класса "спецификация базы класса" .
Таким образом, класс Сircle как производный от базового класса Рoint можно
определить таким образом (программа 13_04.cs):
class Circle : Point // класс "окружность на плоскости"
{ // Закрытое поле:
double rad; // радиус окружности
// свойство для радиуса окружности:
public double Rad { get { return rad; }
set { rad = value; } }
// свойство для значения длины окружности:
public double Len { get { return 2 * rad * Math.PI; } }
// свойство для центра окружности:
public Point Centre
{
get
{
Point temp = new Point();
temp.X = X;
temp.Y = Y;
return temp;
}
set { X = value.X; Y = value.Y; }
}
public void display()
{
Console.WriteLine("Centre: X={0}, Y={1}; "
+
"Radius={2}, Length={3,6:f2}",
X, Y, rad, Len);
}
}
В производном классе Circle явно определены поле double rad, три уже
рассмотренных свойства Rad, Len Centre и метод display(). По сравнению с
предыдущими примерами класс Point не изменился. Он так же содержит два
закрытых поля, задающих координаты точки, и два открытых свойства X, Y,
обеспечивающие доступ к этим полям. В классе Point конструктор добавлен
компилятором. Нет явного определения конструктора и в классе Сircle. Поэтому
объекты класса Circle можно создавать только с умалчиваемыми значениями полей.
При наследовании производный класс "получает в наследство" все поля,
свойства и методы базового класса, за исключением конструктора – конструктор
базового класса
"конструктор: базового класса"
не наследуется. Получив от
базового класса его поля, методы и свойства, базовый класс может по-разному
"распорядиться с наследством". Поля базового класса
"поля базового класса"
непосредственно входят в число полей производного класса. Однако доступ к полям
базового класса для методов, свойств и объектов производного класса разрешен не
всегда. Закрытые поля свойства и методы базового класса недоступны для методов,
свойств и объектов производного класса.
Открытые поля, методы, и свойства базового класса доступны для методов,
свойств и объектов производного класса. В нашем примере класс Point имеет два
открытых свойства, которыми можно пользоваться как внутри класса Circle так и
во внешнем мире, обращаясь к этим свойствам с помощью объектов класса circle. В
методе display() производного класса выполняется непосредственное обращание к
унаследованным свойствам X, Y.
Особое внимание в нашем примере с наследованием нужно обратить на
свойство Circle.Centre. При агрегации и композиции класса Point в класс Circle
значением этого свойства служит ссылка на непосредственно существующи
й
объект класса Point. В случае наследования в объекте класса Circle объекта класса
Point нет – присутствуют только поля такого объекта и в классе Circle доступны
открытые свойства класса Point. Поэтому для объявления в классе Circle свойства
Centre объект класса Point приходится "реконструировать". В get-аксессоре явно
создаётся временный объект класса Point, его полям присваиваются значения полей,
унаследованных классом Circle от базового класса Point. Ссылка на этот временный
объект возвращается как значение свойства Circle.Centre. Set-аксессор свойства
Circle.Centre очень прост – используются унаследованные свойства X, Y класса
Point.
Следующий фрагмент программы (см. 13_04.cs) демонстрирует возможности
класса Сircle.
class Program
{
static void Main( )
{
Circle rim = new Circle( );
rim.X = 24;
rim.Y = 10;
rim.Rad = 2;
rim.display();
rim = new Circle( );
rim.display( );
}
}
В методе Main( ) создан объект класса Сircle. Он ассоциирован со ссылкой
rim, и с ее помощью осуществляется доступ как к свойствам и методам объекта
класса Сircle, так и к свойствам объекта базового класса Рoint. Следующие
результаты выполнения программы дополняют приведенные объяснения:
Centre: X=24, Y=10; Radius=2, Length= 12,57
Centre: X=0, Y=0; Radius=0, Length= 0,00
В языке UML предусмотрено специальное обозначение для отношения
наследования классов "класс: отношения наследования классов" . Два класса (см.
рис. 13.3) изображаются на диаграмме отдельными прямоугольниками, которые
соединены сплошной линией со стрелкой на одном конце. Стрелка направлена на
базовый класс.
Рис. 13.4 . Диаграмма к программе 13_04.cs с наследованием классов
