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

41.Конструктор и деструктор, указатели на объекты.

Конструктор – это процедура, в которой

ключевое слово PROCEDURE заменено на CONSTRUCTOR. К конструктору необходимо

обращаться перед началом работы с

виртуальными методами объекта.

• Допускается наличие у объекта нескольких

конструкторов.

• Конструкторы наследуются точно так же, как и другие методы.

• Главная задача конструктора – организация

связи конкретного экземпляра объекта с

соответствующей ему таблицей виртуальных методов.

Деструктор. Это вид Procedure, служащий для

освобождения памяти, т.е. разрушения

объектов.

Указатели на объекты.

Объявим класс TMyObject и переменную – указатель на объект класса TMyObject.

Type

TMyObject = object

end;

Var Pobject : ^TMyObject;

Для того, чтобы создать динамический объект обращаемся к процедуре New(Pobject). Если объект содержит виртуальные методы, то необходимо провести инициализацию

объекта путем вызова конструктора:

New(Pobject);

Pobject^.create(<список аргументов>);

Другой вариант создания и инициализации объекта путем использования процедуры

New c двумя параметрами:

New(<тип – указатель на класса>, <конструктор>( <список параметров> ) );

New( Pobject, TMyObject.create( <список параметров> ) );

Деструктор. • В случае динамических переменных, память,

связанная с динамическими объектами, может

освобождаться. Для освобождения памяти

используется процедура Dispose: Dispose(<указатель>);

• Автоматическое обращение к таблице

виртуальных методов с целью определения

объема освобождаемой памяти

осуществляется с помощью виртуального

метода, называемого деструктором.

Заголовок деструктора записывается следующим

образом:

Destructor <имя> (<список параметров>);

Для освобождения памяти достаточно

использовать имя деструктора в качестве аргумента.

процедуры Dispose:

Dispose(<указатель>, <имя деструктора>);

Помимо освобождения памяти,

непосредственно связанной с объектом, в

деструкторе могут быть предусмотрены любые

действия, завершающие процесс работы с данным экземпляром объекта. Указатели на объекты. Вызов деструктора.

Объявим класс TMyObject и переменную – указатель на объект класса TMyObject.

Type

TMyObject = object

end;

Var Pobject : ^TMyObject;

Begin

New( Pobject, TMyObject.create( <список параметров> ) );

Dispose( Pobject, Destroy );

End;

42. Полиморфные объекты.

Для одного и того же типа объекта может существовать

несколько деструкторов. Деструкторы одних объектов могут

наследоваться другими объектами.

Деструкторы бывают статическими и виртуальными.

Рекомендуется делать деструкторы виртуальными для того,

чтобы в процессе работы программы для каждого

экземпляра объекта автоматически вызывался правильный

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

деструкторов просто необходимо, введем понятие

полиморфного объекта. Объект, значениями которого могут

быть экземпляры объектов разных типов, называется

полиморфным.

Когда возникают полиморфные объекты?

Предположим, имеется переменная указатель,

относящаяся к объекту-предку. Значением этой

переменной может являться указатель, ссылающийся на

любого из потомков объекта предка. Тогда определить, с объектом какого типа мы работаем, можно только

динамически, анализируя значение указателя. Эту задачу в случае освобождения памяти, распределенной

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

Рассмотрим пример программы, демонстрирующей

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

43.События. В приложениях и компонентах событие

возникает как результат послания операционной

системе сообщения, что произошло некоторое

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

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

назначил ли пользователь соответствующий

обработчик событий. Если событие произошло и обработчик назначен, то метод послания

уведомляет о событии вызывает соответствующий

обработчик. Методы послания уведомления о

событии можно переопределить, используя

стандартные методы, или создать свои

собственные.

Рассмотрим вариант переопределения методов послания

уведомления о событии.

Такие методы реализуются в разделе Protected.

TtimeButton= class(Tbutton)

Protected

Procedure click; override;

End;

Procedure TtimeButton.Click;

Begin

Inherited Click;

Caption := DataTimeToStr(Now);

End;

Методы послания уведомления о событии

являются указателями на метод, которые

вызываются в случае, когда компонент

получает сообщение от Windows о том, что

произошло некоторое событие,

воздействующее на данный компонент.

Обработчики событий представляют собой свойства, которые выполняют чтение и запись в указатели на метод. Например, рассмотрим

фрагмент, взятый из класса TControl,

содержащегося в исходном коде VCL.

Класс TNotifyEvent. Имена обработчиков событий по соглашению содержат префикс

On. Вначале объявляется событие: TNotifyEvent = procedure(Sender:

Tobject) of Tobject;. Далее объявляется класс, содержащий поля данного

типа, и обработчики событий, работающие с этими полями.

Type

TNotifyEvent = procedure(Sender: Tobject) of Tobject;

TControl=class(TComponent)

FOnClick : TNotifyEvent;

Property OnClick: TNotifyEvent read FOnClick write FOnClick;

End;