Всё сдал! - помощь студентам онлайн Всё сдал! - помощь студентам онлайн

Реальная база готовых
студенческих работ

Узнайте стоимость индивидуальной работы!

Вы нашли то, что искали?

Вы нашли то, что искали?

Да, спасибо!

0%

Нет, пока не нашел

0%

Узнайте стоимость индивидуальной работы

это быстро и бесплатно

Получите скидку

Оформите заказ сейчас и получите скидку 100 руб.!


Путешествуя по TObject. Или как оно работает

Тип Реферат
Предмет Информатика и программирование
Просмотров
1476
Размер файла
25 б
Поделиться

Ознакомительный фрагмент работы:

Путешествуя по TObject. Или как оно работает

Максим Игнатьев

Каждый класс в Delphi является наследником TObject, и, соответственно, обладает всеми его свойствами и методами. Это, несомненно, полезный факт, но каковы его методы и свойства, каковы его основные свойства и как их можно использовать? Как мы увидим немного позже, очень многое в реализации TObject направлено на описание объектной модели Delphi.

Рассмотрим его описание поподробнее.

TObject = class

constructor Create;

procedure Free;

class function InitInstance(Instance: Pointer): TObject;

procedure CleanupInstance;

function ClassType: TClass;

class function ClassName: ShortString;

class function ClassNameIs(const Name: string): Boolean;

class function ClassParent: TClass;

class function ClassInfo: Pointer;

class function InstanceSize: Longint;

class function InheritsFrom(AClass: TClass): Boolean;

class function MethodAddress(const Name: ShortString): Pointer;

class function MethodName(Address: Pointer): ShortString;

function FieldAddress(const Name: ShortString): Pointer;

function GetInterface(const IID: TGUID; out Obj): Boolean;

class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;

class function GetInterfaceTable: PInterfaceTable;

function SafeCallException(ExceptObject: TObject;

ExceptAddr: Pointer): HResult; virtual;

procedure AfterConstruction; virtual;

procedure BeforeDestruction; virtual;

procedure Dispatch(var Message); virtual;

procedure DefaultHandler(var Message); virtual;

class function NewInstance: TObject; virtual;

procedure FreeInstance; virtual;

destructor Destroy; virtual;

end;

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

Сразу хочу оговориться, методы - конструкторы и деструкторы на самом деле являются операторами, то есть внутренними, не зависящими от их реализации в коде, конструкциями.

Constructor Create;

Все объекты создаются посредством вызова конструктора. Собственно конструктор не обязан называться Create, просто это принятое название данного метода. Конструктор на самом деле является методом класса, и в процессе его работы вызываются следующие методы:

NewInstance

InitInstance

Create

AfterConstruction

На самом деле вызов этих методов происходит достаточно интересно. В TObject конструктор не выполняет никакой деятельности, однако, как корневой класс иерархии он создается на уровне RTM. Что же происходит? После вызова конструктора RTM вызывает метод NewInstance, который выделяет область в памяти, согласуясь при этом со значением vmtInstanceSize, которое формируется при компиляции. В рамках вызова NewInstance выполняется вызов InitInstance, который заполняет поля метода значениями, обозначенными в модификаторах default, далее выполняется код, описанный в теле процедуры Create (или той, что заявлена в качестве конструктора), после чего управление передается в точку, определенную в точке vmtAfterConstruction, которая по умолчанию указывает на метод AfterConstruction. Все эти манипуляции позволяют максимально упростить процесс гибкого создания экземпляра класса в рамках объектной модели Delphi. Таким образом, при создании экземпляра класса (объекта) вы можете «поприсутствовать» на любой его фазе. Смысл процедуры AfterConstruction состоит в том, чтобы выявить момент окончания конструирования класса. Удобство его использования состоит в том, что он вызывается только при удачном выполнении конструктора, что, сами понимаете достаточно выгодно. На сегодняшний момент только TCustomForm и TCustomDataModule перегружают этот метод специально для того, чтобы выполнить специфичные для них функции, так что мешает нам сделать то же самое? Но это уже вопрос конструирования класса.

Что же произойдет при возникновении исключительной ситуации в рамках конструктора? Здесь важно знать о том, что все элементы класса уже созданы и при возникновении исключительной ситуации мы знаем, что можно удалить. Так вот при возникновении исключения вызываются все действия, связанные с разрушением - вызов деструктора, все по полной программе.

Важно знать, что при вызове конструктора класса он вызывается как конструктор и создает экземпляр, при вызове же конструктора у объекта он вызывается как процедура и нового экземпляра не создает, отсюда получают свое начало ошибки следующего рода:

Var

O : TObject;

Begin

O.Create; // Неверный вызов

O := TObject.Create; // Корректный вызов

End;

При вызове метода конструктора у объекта важно отметить тот факт, что если в конструкторе создаются поля-объекты, то тут возникает потенциальная опасность утечки памяти, так как новые экземпляры создаются, а старые не уничтожаются.

Procedure Free;

Эта процедура инициирует процесс разрушения объекта в памяти. Почему же не деструктор? Вызов деструктора является корректным освобождением ресурсов для устаревшего способа определения объектов object. Если же посмотреть на то, каким образом работает эта процедура, то можно увидеть интереснейшую картину.

procedure TObject.Free;

asm

TEST EAX,EAX

JE @@exit

MOV ECX,[EAX]

MOV DL,1

CALL dword ptr [ECX].vmtDestroy

@@exit:

end;

Что же мы видим? В первой строке происходит сверка указателя на Self (себя) с нулем - а не освободили ли нас уже? Если еще нет, то соответственно указателю на vmtDestroy мы вызываем реальный деструктор. В противном случае происходит выход из процедуры. Таким образом происходит тривиальная «проверка на дурака» со стороны RTM Delphi. При вызове же деструктора мы непосредственно освобождаем (или не освобождаем, а зря) ресурсы объекта. Опять же при освобождении ресурсов выполняется полный набор действий.

BeforeDestruction

FreeInstance

Метод FreeInstance вызывает каскад процедур, направленных на освобождение всех захваченных ресурсов, в том числе и динамических массивов, Variant типов и многого другого. Это должно быть полезно при возникновении исключительных ситуациях в конструкторе при уже созданных внутренних динамических структурах. Это также весьма полезно как механизм сбора мусора внутри объекта.

class function InitInstance(Instance: Pointer): TObject;

Функция инициализации экземпляра информацией из VMT, при этом учитывается использование интерфейсов при наследовании. Важно обратить внимание на то, что это функция класса, фактически эта функция заполняет болванку объекта, созданную функцией NewInstance.

Procedure CleanupInstance;

Процедура возврата экземпляра к «девственному» содержанию. При этом используются информация, хранящаяся в vmtInitTable и в vmtParent.

Function ClassType: TClass;

Возвращает класс объекта. А если быть более точным, то возвращается непосредственно указатель на VMT.

class function ClassName: ShortString;

Возвращает название класса. Используется VMT.

class function ClassNameIs(const Name: string): Boolean;

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

class function ClassParent: TClass;

Отдает указатель на родительский класс. Используется при выполнении оператора is.

class function ClassInfo: Pointer;

Возвращает указатель на RTTI информацию о классе. Если класс скомпилирован без использования директивы $M+, то возвращается nil.

class function InstanceSize: Longint;

Размер экземпляра. Как видно из описания информация о размере и о RTTI хранится в VMT вне привязки к конкретному экземпляру. Судя по всему, эта информация формируется во время компиляции.

class function InheritsFrom(AClass: TClass): Boolean;

Возвращает точное указание на то, что данный класс унаследован от искомого. Эта функция сканирует VMT и родителей этого VMT на соответствие указанному классу.

class function MethodAddress(const Name: ShortString): Pointer;

Сканирует VMT на наличие метода и при удачном результате возвращает указатель но него. При не нахождении метода в "родной" VMT сканируется VMT родителя и так до тех пор, пока не будет найден (или не найден) адрес метода. Таким образом осуществляется реализация метаморфизма в объектной модели Delphi.

class function MethodName(Address: Pointer): ShortString;

Функция обратна предыдущей.

Function FieldAddress(const Name: ShortString): Pointer;

Доступ к полям. Возвращает указатель на поле. Как всегда использует VMT.

Function GetInterface(const IID: TGUID; out Obj): Boolean;

Используется при наследовании интерфейсов и возвращает интерфейс указываемого IID.

class function GetInterfaceEntry(const IID: TGUID): PinterfaceEntry;

Возвращает точку входа интерфейса на указанный IID.

class function GetInterfaceTable: PInterfaceTable;

Таблица интерфейсов. Несмотря на то, что заявлено использование бесконечного числа интерфейсов, в исходном тексте ясно указано на 10000 элементов таблицы интерфейсов. Я, разумеется, не хочу поставить эксперимент и попытаться превысить этот лимит, но прогресс идет такими темпами, что, боюсь, через некоторое время этот лимит будет исчерпан.

Function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HResult; virtual;

Безопасная обработка прерывания, однако, использование этого метода непосредственно в TObject вернет Вам E_UNEXPECTED, то есть что-то неожиданное. Вызывается каждый раз при возникновении исключения внутри кода объекта с указанием на объект исключения и адрес, вызвавший исключение.

Procedure AfterConstruction; virtual;

Процедура, вызываемая после создания экземпляра. Вызов процедуры осуществляется по адресу, прописанному в VMT. Прямой вызов нигде не прописан, судя по всему, эта возможность прописана в RTM, где указаны все вызовы.

Procedure BeforeDestruction; virtual;

Процедура, вызываемая до разрушения объекта.

Procedure Dispatch(var Message); virtual;

Вследствие использования Windows в качестве базовой платформы разработчики решили не проходить мимо основного способа обработки межобъектного взаимодействия - системы сообщений. Этот способ как раз и реализуется этим методом. Весьма разумно было поместить его именно в TObject, ведь он является базовым для всех классов, определенных в рамках объектной модели Delphi. Этот метод сканирует VMT на наличие обработчика сообщения, ID которого указан в первых 4 байтах (длинное слово,Cardinal) параметра Message и если не находит, то вызывает DefaultHandler. То есть можно отлавливать события, происходящие не только у элементов управления, но и у классов низшей иерархии.

Procedure DefaultHandler(var Message); virtual;

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

class function NewInstance: TObject; virtual;

Создает экземпляр класса. Разумно использовать эту функцию для клонирования объектов, так как, не зная исходного класса, можно создавать новые экземпляры уже готовых объектов без использования RTTI.

procedure FreeInstance; virtual;

Освобождает ресурсы экземпляра. Использование этого метода не приветствуется по причине его тесной взаимосвязи с VMT, то есть перегрузка этого метода должна производиться с большой осторожностью. Вызов же метода напрямую в совокупности с InitInstance может служить для того, чтобы создать экземпляр «в себе», ведь некоторые задачи требуют отката состояния объекта на момент создания.

destructor Destroy; virtual;

Собственно деструктор. Вызывается методом Free после удостоверения в том, что экземпляр пока существует. Есть одно замечание по поводу именования деструктора - он должен называться Destroy, это связано с его виртуальностью, а соответственно и перегрузкой. Если Вы назовете деструктор другим именем, то при попытке вызвать унаследованный метод RTM не найдет описание метода с вашим именем, а это повлечет за собой нарушение функциональности процедуры разрушения объекта. Однако интересно отметить одну деталь. Наличие вызова унаследованного деструктора не обязательно, хотя и желательно - ведь не все разработчики любят обрабатывать события времени исполнения, а освобождение памяти, отведенной под экземпляр, произойдет без участия кода, описанного в деструкторе.

Давая описание методам базового класса TObject, я пытался дать представление об объектной модели Delphi, о жизненном цикле объекта, о методах использования объектов в собственных программах и правилах перегрузки. Как видно из вышесказанного основой для работы с экземплярами является VMT, и использование RTTI не всегда необходимо для выполнения некоторых специфических операций с экземпляром. Использование же RTTI, на мой взгляд, не всегда оправдывается, однако при написании RunTime редакторов компонент это средство достаточно удобно.

В результате изучения исходного кода обнаружился интереснейший момент - при вызове любого метода в EAX находится указатель … на VMT! Не это ли является явным указанием на объектную ориентированность Delphi?! Изучая материалы книги "Delphi in nutshell" Рэя Лишнера (Ray Lischner) я наткнулся на интересный факт - таблицу сравнения объектных моделей некоторых языков, позволю себе привести ее с некоторым переводом и дополнениями:

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

ВозможностьDelphiC++JavaVisual Basic
Наследование+++
Множественное наследование+
Интерфейсы+Как чисто абстрактные классы++
Один базовый класс++
Метаклассы++
Статические поля классовКак поля модуля++
Виртуальные методы+++
Абстрактные методы+++
Статические методы классов+++
Динамические методы+
Сбор мусораИнтерфейсные методы и динамические деструкторы+Интерфейсные методы
Типы Variant++
OLE automation++
Статический контроль типов+++
Обработка исключений++++
Перегрузка методов+++
Полиморфные вызовы++
Перегрузка операторов+
Методы - не члены класса+++
Переменные - не члены объекта+++
Свойства++
RTTI+Только для операторов is и as+
Общие типы (шаблоны)+
Поддержка нитей++
Обработка сообщений +
Встроенный ассемблер+В некоторых реализациях+
Inline функции+
Пакеты++
Друзья классаМодульная видимость+Пакетная видимость

Тут видны некоторые особенности, которые не очевидны на первый взгляд. Что же такое динамические методы? Сразу стоит оговориться - это модификатор способа вызова метода, и по этому его сразу надо поставить в один ряд с другими способами вызова методов - статическими, виртуальными и репредставительными. Чем же они отличаются и когда они нужны?

Статические методы (их аналог в Java - final, финальные) являются не перегружаемыми методами, их функциональность окончательна, например конструктор Create класса TObject - он пуст и никакой дополнительной деятельности не несет, по этому вызов этого метода не полиморфен. По этому, если вы хотите перегрузить статический метод, то Вам придется заново описывать всю его функциональность.

Виртуальные методы это методы, которые позволяют формировать цепочки полиморфных вызовов посредством статического связывания через таблицу виртуальных методов VMT. Это выгладит приблизительно так:

МетодСсылка
DoOneSelf.DoOne
DoTwoSelf.Parent.DoTwo
DoThree Self.Parent.Parent.DoThree

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

Динамические методы хранят точки входа в специальной таблице динамических методов, эта таблица строится только для измененных или добавленных методов. Таким образом храниться меньше информации о классе, но вызов методов происходит дольше, вследствие линейного поиска метода в таблице динамических методов класса и его родителей, на что затрачивается некоторое время.

Репредствавительные методы это методы, функциональность которых переопределена полностью относительно родителя. Вообще-то указание директивы reintroduce не обязательно, но это избавит Вас от лишнего предупреждения о перегрузке метода со стороны компилятора.

Еще одна интересная особенность TObject - это хранение на уровне VMT информации о трех методах с интересным названием: QueryInterface, AddRef и Release. То есть любой класс, созданный в рамках объектной модели Delphi является COM объектом! Единственным ограничением здесь является то, что для функционирования этих методов необходимо унаследовать хотя бы один интерфейс, что и сделано в рамках другого базового класса TInterfacedObject.

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


Нет нужной работы в каталоге?

Сделайте индивидуальный заказ на нашем сервисе. Там эксперты помогают с учебой без посредников Разместите задание – сайт бесплатно отправит его исполнителя, и они предложат цены.

Цены ниже, чем в агентствах и у конкурентов

Вы работаете с экспертами напрямую. Поэтому стоимость работ приятно вас удивит

Бесплатные доработки и консультации

Исполнитель внесет нужные правки в работу по вашему требованию без доплат. Корректировки в максимально короткие сроки

Гарантируем возврат

Если работа вас не устроит – мы вернем 100% суммы заказа

Техподдержка 7 дней в неделю

Наши менеджеры всегда на связи и оперативно решат любую проблему

Строгий отбор экспертов

К работе допускаются только проверенные специалисты с высшим образованием. Проверяем диплом на оценки «хорошо» и «отлично»

1 000 +
Новых работ ежедневно
computer

Требуются доработки?
Они включены в стоимость работы

Работы выполняют эксперты в своём деле. Они ценят свою репутацию, поэтому результат выполненной работы гарантирован

avatar
Математика
История
Экономика
icon
159599
рейтинг
icon
3275
работ сдано
icon
1404
отзывов
avatar
Математика
Физика
История
icon
156450
рейтинг
icon
6068
работ сдано
icon
2737
отзывов
avatar
Химия
Экономика
Биология
icon
105734
рейтинг
icon
2110
работ сдано
icon
1318
отзывов
avatar
Высшая математика
Информатика
Геодезия
icon
62710
рейтинг
icon
1046
работ сдано
icon
598
отзывов
Отзывы студентов о нашей работе
63 457 оценок star star star star star
среднее 4.9 из 5
Тгу им. Г. Р. Державина
Реферат сделан досрочно, преподавателю понравилось, я тоже в восторге. Спасибо Татьяне за ...
star star star star star
РЭУ им.Плеханово
Альберт хороший исполнитель, сделал реферат очень быстро, вечером заказала, утром уже все ...
star star star star star
ФЭК
Маринаааа, спасибо вам огромное! Вы профессионал своего дела! Рекомендую всем ✌🏽😎
star star star star star

Последние размещённые задания

Ежедневно эксперты готовы работать над 1000 заданиями. Контролируйте процесс написания работы в режиме онлайн

Подогнать готовую курсовую под СТО

Курсовая, не знаю

Срок сдачи к 7 дек.

только что
только что

Выполнить задания

Другое, Товароведение

Срок сдачи к 6 дек.

1 минуту назад

Архитектура и организация конфигурации памяти вычислительной системы

Лабораторная, Архитектура средств вычислительной техники

Срок сдачи к 12 дек.

1 минуту назад

Организации профилактики травматизма в спортивных секциях в общеобразовательной школе

Курсовая, профилактики травматизма, медицина

Срок сдачи к 5 дек.

2 минуты назад

краткая характеристика сбербанка анализ тарифов РКО

Отчет по практике, дистанционное банковское обслуживание

Срок сдачи к 5 дек.

2 минуты назад

Исследование методов получения случайных чисел с заданным законом распределения

Лабораторная, Моделирование, математика

Срок сдачи к 10 дек.

4 минуты назад

Проектирование заготовок, получаемых литьем в песчано-глинистые формы

Лабораторная, основы технологии машиностроения

Срок сдачи к 14 дек.

4 минуты назад

2504

Презентация, ММУ одна

Срок сдачи к 7 дек.

6 минут назад

выполнить 3 задачи

Контрольная, Сопротивление материалов

Срок сдачи к 11 дек.

6 минут назад

Вам необходимо выбрать модель медиастратегии

Другое, Медиапланирование, реклама, маркетинг

Срок сдачи к 7 дек.

7 минут назад

Ответить на задания

Решение задач, Цифровизация процессов управления, информатика, программирование

Срок сдачи к 20 дек.

7 минут назад
8 минут назад

Все на фото

Курсовая, Землеустройство

Срок сдачи к 12 дек.

9 минут назад

Разработка веб-информационной системы для автоматизации складских операций компании Hoff

Диплом, Логистические системы, логистика, информатика, программирование, теория автоматического управления

Срок сдачи к 1 мар.

10 минут назад
11 минут назад

перевод текста, выполнение упражнений

Перевод с ин. языка, Немецкий язык

Срок сдачи к 7 дек.

11 минут назад
planes planes
Закажи индивидуальную работу за 1 минуту!

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

«Всё сдал!» — безопасный онлайн-сервис с проверенными экспертами

Используя «Свежую базу РГСР», вы принимаете пользовательское соглашение
и политику обработки персональных данных
Сайт работает по московскому времени:

Вход
Регистрация или
Не нашли, что искали?

Заполните форму и узнайте цену на индивидуальную работу!

Файлы (при наличии)

    это быстро и бесплатно