Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
10 Классы испр.doc
Скачиваний:
20
Добавлен:
27.10.2018
Размер:
94.21 Кб
Скачать

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 действуют следующие правила объявления и наследования методов:

  1. Слово virtual для объявления метода виртуальным появляется в отдельном операторе после заголовка подпрограммы. Для объявления динамического метода используется слово dynamic. Virtual или dynamic вводят новый виртуальный метод.

  2. Для замещения наследуемого статического метода никаких дополнительных операторов не используется. Но если в производном (порожденном) классе надо заместить (перекрыть) существующий наследуемый виртуальный или динамический метод, используется ключевое слово (директива) override. С его помощью можно переопределить любой виртуальный метод.

  3. В одноименных статических методах производных классов списки параметров могут различаться. Списки параметров виртуальных методов порождающего и порожденного классов должны быть идентичны. Вызов виртуального метода во время выполнения программы может привести к вызову одной из реализаций в производных классах.

Со статическим методом связан следующий способ наследования. Если в объявлении потомка появляется метод с тем же именем, что и у предка, то в этом типе и во всех его потомках этот метод будет переопределен. Таким обра­зом, потомки могут использовать переопределенные ими методы предка. Пото­мок может вызвать только свои методы и не переопределенные им методы своих предков; методы потомков для него недоступны.

Объявление override-метода должно совпадать с объявлением исходного virtual или dynamic-метода, в том числе по количеству параметров, их последо­вательности, типам соответствующих параметров и типу возвращаемого резуль­тата для метода-функции. В случае нарушения одного из этих правил трансля­тор выдает сообщение об ошибке.

Директивы virtual и dynamic всегда вводят новое имя метода, а директива override всегда указывает на новую реализацию уже существующего наследуе-рго виртуального метода.

В соответствии с типами методов процесс установки взаимосвязи объектов и методов может быть:

  • ранним - во время компиляции - для статических методов;

  • поздним - во время выполнения программы (вызова метода) - для виртуаль­ных методов.

По умолчанию (без слов virtual, dynamic и override) методы являются стати­ческими; их адрес определяется во время компиляции проекта (раннее связыва­ние). Они вызываются быстрее всего. Транслятор разрешает (формирует) вызо­вы статических методов на этапе компиляции.

Адреса виртуальных и динамических методов при их вызове (разрешение ссылок на методы) определяются не во время компиляции, а во время выполне­ния программы по специальной таблице (позднее связывание).

В Delphi программисту предоставляется возможность работать не с сообще­ниями Windows, а с событиями, которые формируются на основе сообщений. Со­бытие представляет собой свойство процедурного типа, предназначенное для ре­акции на событие. Этому свойству можно присвоить (указать) метод, вызываемый при наступлении этого события. Такие методы называют обработчиками событий.

Пример назначения обработчика события для OnHint - свойства приложе­ния:

Application.OnHint := DisplayHint;

где DisplayHint - имя процедуры - метода для вывода подсказок, обработчика события для свойства OnHint.