Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Конструкторы и деструкторы. Динамические объекты

OneCircle B

 

B

 

Иными словами, Turbo Pascal обеспечивает вызов в процессе выполнения программы именно того виртуального метода, который определен для вызывающего объекта. Таким образом, один и тот же метод Move будет работать по-разному (передвигать различные фигуры) в зависимости от того, какой объект этот метод вызывает. Такое свойство называется полиморфизмом и представляет широкие возможности при разработке программ.

Работа с виртуальными методами будет происходить немного медленнее, чем с обычными (статистическими) методами; кроме того, виртуальные методы приводят к дополнительному расходу оперативной памяти. Однако, эти издержки весьма невелики и не должны служить препятствием для использования виртуальных методов.

 

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

В последнем примере из предыдущего раздела таким конструктором является Create.

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

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

var

CirclePtr: ^TCircle;

begin

New (CirclePtr);

CirclePtr^.Create (100, 200, 35);

Данный пример показывает, что способ динамического образования экземпляров объектов ничем не отличается от порождения значений любых других типов. Нужно еще заметить следующее. Как уже говорилось, если объект содержит виртуальные методы, к его экземпляру должен быть применен соответствующий конструктор (это действие и показано в последнем операторе фрагмента). Таким образом, порождение объекта и его инициализация конструктором являются теми действиями, которые совершаются последовательно. В целях большей наглядности Turbo Pascal допускает совмещение этих двух действий в одном вызове New: если первым параметром стандартной процедуры New является указатель на объектовый тип, то вторым параметром процедуры может являться вызов его конструктора, например:

New (CirclePtr.Create (100, 200, 35));

Обратите внимание, что вызов конструктора в последнем случае не содержит составного (точечного) имени, так как первый параметр New однозначно определяет, из какого объектового типа берется конструктор Create.

Освобождение динамической памяти, выделенной объекту, реализуется стандартной процедурой Dispose, также аналогично значениям других типов:

Dispose (PointPtr);

С процедурой освобождения памяти связан особый вид методов, в некотором смысле симметричный методам-конструкторам. Эти методы называются деструкторами и предназначены для выполнения каких-либо действий завершающего характера. Деструкторы оформляются так же, как обычные методы-процедуры, с заменой служебного слова procedure на служебное слово destructor. В отличие от методов-конструкторов, деструкторы могут быть виртуальными и могут наследоваться; в одном объектовом типе может быть определено несколько деструкторов.

Использование деструкторов реально необходимо в случае, когда экземпляр объекта был создан динамически (процедурой New). Тогда завершение работы с данным экземпляром рекомендуется производить посредством расширенного вида процедуры Dispose, вторым параметром которой является вызов деструктора. Например, если PointPtr - указатель на экземпляр объектового типа TPoint, а Point.Done - деструктор этого типа, то можно совместить операцию освобождения памяти с завершающими действиями с экземпляром:

Dispose (PointPtr.Done);

Вызов деструктора, как такового (вне процедуры Dispose), не приведет к освобождению памяти, занимаемой экземпляром объекта. Необходимость введения деструкторов вызывается следующим обстоятельством.

Предположим, что имеются указатели на два экземпляра объектов, один из которых имеет родительский тип, другой тип-потомок: PointPtr и CirclePtr. По правилам совместимости допустимо присваивание вида: PointPtr:= CirclePtr; После такого присваивания указатель PointPtr содержит ссылку на область большего размера, нежели память, отводимая для экземляров типа TPoint. В данной ситуации применение к указателю PointPtr стандартной процедуры Dispose с методом-деструктором в качестве второго параметра гарантирует корректное освобождение именно того объема памяти, который реально занимает экземпляр по указателю PointPtr.

<== предыдущая лекция | следующая лекция ==>
OneCircle | Тема 5. Производственные ресурсы предприятия: основные средства, материальные, трудовые и показатели их использования
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 413; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.