Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Климов. Лекции / Алг_яз_Лекция_5.pptx
Скачиваний:
27
Добавлен:
14.05.2015
Размер:
625.01 Кб
Скачать

Необходимо помнить, что хотя методы могут быть переопределены, поля данных переопределяться не могут.

После того как поле данных в иерархии объекта определено, никакой дочерний тип не может определить поле данных с таким же именем.

Переопределение методов

21

Все описанные до сих пор методы, относящиеся к типам объектов TPerson, TStudent, TStaff и TTeacher, являются

статическими методами.

С ними связана проблема наследования.

22

Рассмотрим процедуру

Наследование статических методов

23

НАСЛЕДОВАНИЕ

СТАТИЧЕСКИХ МЕТОДОВ

Есть ли необходимость выполнять в процедуре ShowSum какие­либо дополнительные действия?

По сравнению с типом TStaff не изменилось ничего, кроме копирования процедуры и подстановки квалификатора ТТеасher перед идентификатором

ShowSum.

Возникает резонный вопрос, нет ли здесь логической ошибки?

Поскольку методы одинаковы, нет нужды помещать

ShowSum в TStaff и TTeacher.

TTeacher автоматически наследует ShowSum от TStaff, поэтому нет необходимости переопределять этот метод.

Именно здесь и возникает проблема, связанная со

 

статическими методами

24

Проблема заключается в следующем:

Пока копия метода

Наследование статических методов

25

НАСЛЕДОВАНИЕ СТАТИЧЕСКИХ МЕТОДОВ

Это объясняется способом, которым компилятор осуществляет вызов методов.

Как и при вызове любой процедуры, компилятор замещает ссылки на TStaff.GetSum и TStaff.ShowSum в исходном коде на их адреса в сегменте кода.

Поскольку тип TTeacher является потомком типа TStaff, то сначала в сегмент кода будет скомпилирована функция TStaff.GetSum.

Затем будет скомпилирована процедура

TStaff.ShowSum, вызывающая TStaff.GetSum

26

При вызове код TStaff.ShowSum в свою очередь вызывает

TStaff.GetSum, что и составляет проблему.

Фактически, наследуется

следующая процедура:

PROCEDURE TStaff.ShowSum;

 

BEGIN

 

WriteLn(GetSum);

 

END;

Метод объекта TStaff ничего не знает о существовании

 

объекта TTeacher.

Таким образом, метод ShowSum нельзя наследовать.

Вместо этого он должен быть переопределен своей второй копией, вызывающей уже правильный метод.

Наследование статических методов

27

Вызывая методы, компилятор работает

так:

Наследование статических методов

28

Наследование статических методов

29

Если статический наследуемый метод найден и используется, то необх

Наследование статических методов

30

Соседние файлы в папке Климов. Лекции