- •1. Основные понятия объектно-ориентированного программирования
- •2. Определение класса. Инкапсуляция. Синтаксис и программирование свойств
- •2.1. Поля
- •2.2. Свойства
- •3. Методы
- •4. Наследование
- •5. Полиморфизм
- •6. Создание и уничтожение объектов. Конструкторы. Деструкторы
- •7. Области видимости
- •8. Динамическая информация о типе. Оператор Is и оператор As
4. Наследование
Наследование - это способность одного класса использовать характеристики (описание) другого. Одна из фундаментальных концепций объектного программирования - это наследование классов, устанавливающее между двумя классами отношения «предок — потомок». Предок - это класс, предоставляющий свои возможности и характеристики (описание) другим классам через механизм наследования. Класс, который использует характеристики класса посредством наследования, называется его потомком. Непосредственный предок, от которого происходит данный класс, называется родителем.
Object Pascal поддерживает модель наследования, известную как простое наследование. В ней определенный класс-потомок может иметь только одного родителя. Класс-предок может иметь много потомков.
Принцип наследования означает, что, если надо создать новый класс, немного отличающийся от ранее созданного, нет необходимости переписывать заново все существующие поля и методы. Надо объявить класс как потомок (дочерний класс) старого класса. Например:
Type TNewObject = class (TOldObject);
где:
TNewObject - новый класс, потомок, дочерний, порожденный;
TOldObject - старый класс, предок, родитель.
В Object Pascal все классы являются потомками класса TObject. Имя родительского класса в объявлении не обязательно. Если его нет, то родителем предполагается класс TObject. Например, следующие 2 объявления эквивалентны:
TMyObject = class (TObject) ;
TMyObject = class ;
Методы в классах могут быть статические (static), виртуальные (virtual), динамические (dynamic) и абстрактные (abstract). При наследовании поля и методы предков могут быть перекрыты, т. е. заменены новыми полями и методами с теми же именами. Кроме того, в порожденном классе могут быть добавлены новые поля и методы. Методы классов наследуются разными способами в зависимости от их типа.
В отличие от поля перекрытый метод доступен при указании зарезервированного слова inherited. Пример вызова перекрытого метода по имени Methodl:
inherited Method 1;
В Object Pascal действуют следующие правила объявления и наследования методов:
-
Слово virtual для объявления метода виртуальным появляется в отдельном операторе после заголовка подпрограммы. Для объявления динамического метода используется слово dynamic. Virtual или dynamic вводят новый виртуальный метод.
-
Для замещения наследуемого статического метода никаких дополнительных операторов не используется. Но если в производном (порожденном) классе надо заместить (перекрыть) существующий наследуемый виртуальный или динамический метод, используется ключевое слово (директива) override. С его помощью можно переопределить любой виртуальный метод.
-
В одноименных статических методах производных классов списки параметров могут различаться. Списки параметров виртуальных методов порождающего и порожденного классов должны быть идентичны. Вызов виртуального метода во время выполнения программы может привести к вызову одной из реализаций в производных классах.
Со статическим методом связан следующий способ наследования. Если в объявлении потомка появляется метод с тем же именем, что и у предка, то в этом типе и во всех его потомках этот метод будет переопределен. Таким образом, потомки могут использовать переопределенные ими методы предка. Потомок может вызвать только свои методы и не переопределенные им методы своих предков; методы потомков для него недоступны.
Объявление override-метода должно совпадать с объявлением исходного virtual или dynamic-метода, в том числе по количеству параметров, их последовательности, типам соответствующих параметров и типу возвращаемого результата для метода-функции. В случае нарушения одного из этих правил транслятор выдает сообщение об ошибке.
Директивы virtual и dynamic всегда вводят новое имя метода, а директива override всегда указывает на новую реализацию уже существующего наследуе-рго виртуального метода.
В соответствии с типами методов процесс установки взаимосвязи объектов и методов может быть:
-
ранним - во время компиляции - для статических методов;
-
поздним - во время выполнения программы (вызова метода) - для виртуальных методов.
По умолчанию (без слов virtual, dynamic и override) методы являются статическими; их адрес определяется во время компиляции проекта (раннее связывание). Они вызываются быстрее всего. Транслятор разрешает (формирует) вызовы статических методов на этапе компиляции.
Адреса виртуальных и динамических методов при их вызове (разрешение ссылок на методы) определяются не во время компиляции, а во время выполнения программы по специальной таблице (позднее связывание).
В Delphi программисту предоставляется возможность работать не с сообщениями Windows, а с событиями, которые формируются на основе сообщений. Событие представляет собой свойство процедурного типа, предназначенное для реакции на событие. Этому свойству можно присвоить (указать) метод, вызываемый при наступлении этого события. Такие методы называют обработчиками событий.
Пример назначения обработчика события для OnHint - свойства приложения:
Application.OnHint := DisplayHint;
где DisplayHint - имя процедуры - метода для вывода подсказок, обработчика события для свойства OnHint.