Чтение онлайн

на главную - закладки

Жанры

Технологии программирования

Костерин В В

Шрифт:

TMyObject = class(TObject);

TMyObject = class;

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

Приведем объявление базового для всех объектных типов класса TObject:

TObject = class

constructor Create;

destructor Destroy; virtual;

procedure Free;

class function Newlnstance: TObject; virtual;

procedure Freelnstance; virtual;

class procedure Initlnstance(Instance: Pointer):

TObject;

function ClassType: TClass;

class function ClassName: string;

class function ClassParent: TClass;

class function ClassInfo: Pointer;

class function InstanceSize: Word;

class function InheritsFrom(AClass: TClass):

Boolean;

procedure DefaultHandler(var Message); virtual;

procedure Dispatch(var Message);

class function MethodAddress(const Name: string):

Pointer;

class function MethodName(Address: Pointer):

string;

function FieldAddress(const Name: string):

Pointer;

end;

Такая

архитектура возможна только при наличии механизма поддержки информации о типах — RTTI (RunTime Type Information). Основой такого механизма является внутренняя структура классов и, в частности, возможность доступа к ней за счет использования методов классов, описываемых конструкцией class function…

Унаследованные от предка поля и методы доступны в дочернем классе; если имеет место совпадение имен методов, то эти методы перекрываются.

По тому, какие действия происходят при вызове, методы делятся на группы:

• статические (static);

• виртуальные (virtual);

• динамические (dynamic);

• абстрактные (abstract).

Статические методы, а также поля в объектах-потомках ведут себя одинаково: можно без ограничений перекрывать старые имена и при этом изменять тип методов:

type

T1stObj = class

I: Real;

procedure SetData(Avalue: Real);

end;

T2ndObj = class(T1stObj)

I: Integer;

procedure SetData(Avalue: Integer);

end;

procedure T1stObj.SetData;

begin

i: = v;

end;

procedure T2nd0bj.SetData;

begin

i:= 0;

inherited SetData(0.99);

end;

В

этом примере разные методы с именем SetData присваивают значения разным полям с именем i. Перекрытое поле предка недоступно в потомке. В отличие от поля внутри других методов перекрытый метод доступен при указании зарезервированного слова inherited. Методы объектов по умолчанию являются статическими — их адрес определяется еще на стадии компиляции проекта. Они вызываются быстрее всего.

Язык C++ позволяет так называемое множественное наследование. В этом случае новый класс может наследовать часть своих элементов от одного родительского класса, а часть — от другого, это наряду с удобствами зачастую приводит к проблемам.

В Object Pascal понятие множественного наследования отсутствует. Если необходимо, чтобы новый класс объединял свойства нескольких, можно породить классы-предки один от другого или включить в класс несколько полей, соответствующих этим желаемым классам.

Принципиально отличаются от статических методов виртуальные и динамические методы. Они могут быть объявлены путем добавления соответствующей директивы virtual или dynamic. Адрес таких методов определяется во время выполнения программы по специальной таблице. С точки зрения наследования методы этих двух видов одинаковы: они могут быть перекрыты в дочернем классе только одноименными методами, имеющими тот же тип.

Общим для них является то, что при их вызове адрес определяется не во время компиляции, а во время выполнения путем поиска в специальных таблицах. Такой способ еще называется поздним связыванием. Разница между методами заключается в особенности поиска адреса.

Когда компилятор встречает обращение к виртуальному методу, он подставляет вместо обращения к конкретному адресу код, который обращается к специальной таблице и извлекает оттуда нужный адрес. Эта таблица называется таблицей виртуальных методов (Virtual Method Table, VMT), и она есть для каждого объектного типа. В ней хранятся адреса всех виртуальных методов класса независимо от того, унаследованы ли они от предка или перекрыты. Отсюда и достоинства, и недостатки виртуальных методов: они вызываются сравнительно быстро (но медленнее статических), однако для хранения указателей на них требуется большое количество памяти.

Поделиться:
Популярные книги

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Привет из Загса. Милый, ты не потерял кольцо?

Лисавчук Елена
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Привет из Загса. Милый, ты не потерял кольцо?

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Нечто чудесное

Макнот Джудит
2. Романтическая серия
Любовные романы:
исторические любовные романы
9.43
рейтинг книги
Нечто чудесное

Клан

Русич Антон
2. Долгий путь домой
Фантастика:
боевая фантастика
космическая фантастика
5.60
рейтинг книги
Клан

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Убивать чтобы жить 7

Бор Жорж
7. УЧЖ
Фантастика:
героическая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 7

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Хуррит

Рави Ивар
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Хуррит