Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ.docx
Скачиваний:
2
Добавлен:
23.04.2019
Размер:
210.36 Кб
Скачать

21.Понятие объекта и экземпляра объекта в Object Pascal.

Объекты можно представлять несколькими способами.OP использует ссылочную модель объектов. Каждая переменная типа класс называется объектом, но реально содержит лишь указатель на область памяти, в которой содержится значение реального объекта. Эта область оперативной памяти называется экземпляром объект. Несмотря на кажущуюся сложность, такая модель является очень мощной и удобной. Единственная проблема - программист должен вручную отводить память под так называемый экземпляр объекта.Три основных языковых понятия в ОР, реализующих принципы ООП:1) класс — пользовательский тип данных, описывающий поля, свойства, методы и события, которые будут у всех объектов этого класса (переменных этого типа).2) объект — это переменная типа класс, фактически является типизированным указателем.3)экземпляр объекта — место в оперативной памяти, где собственно хранятся значения полей, свойств и адреса методов объекта (по сути, является динамической переменной).

Однако есть определенное отличие динамической переменной от экземпляра объекта. Если для получения значения динамической переменной используется операция разыменования (^), то при работе с экземплярами объекта эту операцию проводить не нужно.Текст фрагмента программы, где используется объект объявленного класса, может выглядеть следующим образом.Создание и уничтожение объекта класса:

// Основная программа

var

AButton: TMyButton;

// Создаем объект

AButton:=TMyButton.Create;

// Записываем значение в его свойство

AButton.ClickCounter:=0;

// Уничтожаем объект

AButton.Free;

End;

В приведенном примере в разделе var описана переменная AButton — объект класса TMyButton. В тексте программы происходит создание объекта, модификация его свойства и в конце — его удаление. Для того чтобы понять, как создается и удаляется объект, необходимо более детально рассмотреть реализацию этого понятия в языке ОР.

Чтобы создать экземпляр объекта, необходимо вызвать метод Create. который является конструктором объекта, а результат его выполнения присвоить переменной-объекту. При создании нового экземпляра объекта класса конструктор применяется к классу, а не к объекту, например, TMyButtonCreate. Такой конструктор есть у всех классов, поскольку он описал как конструктор класса TObject, от которого наследуются все остальные классы. Если создается экземпляр объекта (отводится место в оперативной памяти), то впоследствии его необходимо уничтожить (освободить память). Эта операция выполняется с использованием деструктора. В классе TObject определен деструктор Destroy, который, таким образом, есть у всех классов. Тем не менее, для уничтожения экземпляра объекта рекомендуется использовать метод Free, который также унаследован от класса TObject. Этот метод надежней, поскольку он сначала проверяет не равен ли указатель на экземпляр объекта nil и только затем вызывает деструктор Destroy.

22.Конструкторы и деструкторы. Ключевое слово self.

Ключевое слово self.Отличие методов от процедур и функций состоит в том, что у методов есть неявный параметр, который является ссылкой на тот объект класса, для которого вызван метод. Внутри метода можно явно ссылаться на этот параметр при помощи ключевого слова self. Этот дополнительный скрытый параметр необходим в тех случаях, когда создаются несколько объектов одного класса, так что каждый раз, когда применяется метод к одному из объектов, он должен оперировать со своими данными и не влиять на остальные объекты.

В Delphi ключевое слово self часто используется, когда нужно явно обратиться к текущей форме в одном из ее методов. Типичный пример динамическое создание компонента, когда в конструктор компонента Create необходимо передать параметр Owner (указать владельца), а затем присвоить то же значение свойству Parent (указать родителя). Тем и другим для создаваемого компонента является текущая форма, и лучшим способом указать на нее является использование self.

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

Если конструктор применяется к классу, то сначала происходит создание объекта — под него отводится память, значения всех полей <обнуляются>, при этом порядковым типам в качестве начального значения задается значение с номером 0, указателям присваивается nil, строки задаются пустыми, а поля типа Variant получают значение Unassigned. Затем выполняется код конструктора, в котором обычно описывается инициализация элементов объектов класса (присваивание полям и свойствам начальных значений и пр.) и возвращается указатель на созданный экземпляр объекта.

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

Деструкторы — это специальные методы, уничтожающие объект освобождающие место в оперативной памяти. Объявление деструктора выглядит также как объявление процедуры, но предваряется ключевым слово destructor. В качестве имени деструктора обычно задают Destroy. Реализация деструктора, как правило, завершается вызовом наследуемого деструктора с помощью ключевого слова inherited, чтобы освободить память от наследуемых полей.

Вместо того, чтобы вызывать деструктор Destroy напрямую, принято вызывать специальную процедуру Free, действие которой состоит в том, что он вызывает деструктор Destroy только в том случае, если объект существует (то есть ссылка на него не равна nil

При рассмотрении конструкторов и деструкторов необходимо учитывать, что их нельзя использовать для компонентов Delphi (для объектов любых классов, произошедших от класса TComponent). Любой компонент, попавший при визуальном проектировании из Палитры компонентов в приложение, определяет своим владельцем форму (контейнер), на которую он помещен и для него - конструкторы и деструкторы вызываются автоматически, при создании (уничтожении) владельца, то есть формы. Создание и уничтожение форм делает приложение (глобальный объект с именем Application), для этого в файле проекта вызывается метод Application.CreateForm.