Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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



 

Последний пример программы даст вам возможность приобрести

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

ти объектов, включая использование для удаления объекта деструк-

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

создан связанный список рабочих объектов и как он за ненадоб-

ностью может быть очищен при помощи деструктора.

 

Построение связанного списка объектов требует, чтобы каждый

объект содержал указатель на следующий объект списка. Тип

TEmployee не содержит таких указателей. Простым выходом из этой

ситуации было бы добавление указателя в TEmployee, благодаря че-

му можно быть уверенным, что все потомки TEmployee наследуют та-

кой указатель. Однако, добавление чего-либо в TEmployee требует

от вас наличия исходного кода, а как говорилось ранее, одним из

преимуществ объектно-ориентированного программирования является

возможность расширения объектов без необходимости их перекомпиля-

ции.

 

Решение, которое не требует никаких изменений TEmployee,

создает новый тип объекта, не являющийся потомком TEmployee. Тип

StaffList представляет собой очень простой объект, целью которого

является создание заголовков для объектов типа TEmployee. Так как

TEmployee не содержит никаких указателей на следующий объект в

списке, то простой тип записи TNode осуществляет этот сервис.

TNode даже проще, чем StaffList в том, что TNode не является объ-

ектом, не содержит ни одного метода и не имеет никаких данных, за

исключением указателя на тип TEmployee и указателя на следующий

узел списка.

 

TStaffList содержит метод, который позволяет ему добавлять

нового рабочего в связанный список записей TNode путем внесение

нового экземпляра TNode непосредственно после самого себя в ка-

честве указуемого с помощью указателя поля TNodes. Метод Add при-

нимает указатель на объект типа TEmployee, но не сам объект.

Из-за расширенной совместимости типов Турбо Паскаля указатели на

любого потомка типа TEmployee также должны передаваться в

TList.Add в параметре Item.

 

Программа WorkList описывает статическую переменную Staff

типа TStaffList и строит связанный список из пяти узлов. Каждый

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


 

B.Pascal 7 & Objects /UG - 237 -

 

TEmployee, либо одним из его потомков. Перед созданием каждого

динамического объекта и после того, как объект создан, возвращает

число байт свободной динамической памяти. Наконец, полная струк-



тура, включающая пять записей TNode и пять объектов типа

TEmployee, очищается и удаляется из динамической памяти с помощью

одного вызова деструктора статического объекта Staff типа

TStaffList.

 


 

B.Pascal 7 & Objects /UG - 238 -

 

 

 

List │ Node Node Node

┌───────┐ ┌────┬────┐ ┌────┬────┐ ┌────┬────┐

│ │ │ │ │ │ │ │ │ │ │ │

│ O──┼────> │ O │ O─┼───> │ O │ O─┼────> │ O │ O─┼───┐

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

└───────┘ └──┼─┴────┘ └──┼─┴────┘ └──┼─┴────┘ │

│ │ │ │ ──┴──

v v v ───

│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ─

│ Name │ │ Name │ │ Name │

│ ├─────────────┤ ├─────────────┤ ├─────────────┤

│ Title │ │ Title │ │ Title │

│ ├─────────────┤ ├─────────────┤ ├─────────────┤

│ Rate │ │ Rate │ │ Rate │

│ ├─────────────┤ ├─────────────┤ ├─────────────┤

│ │ │ │ │ │

Сегмент │ Динамически распределяемая область

данных памяти (динамический)

(статические│

объекты)

 

Рис. 9.2 Схема структур данных программы ListDemo.

 

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

 

Деструктор Staff.Done стоит того, чтобы рассмотреть его вни-

мательно. Уничтожение объекта TStaffList включает удаление трех

различных типов структур: полиморфических объектов рабочих струк-

тур в списке, записей TNode, поддерживающих список, и (если он

размещен в динамической памяти) объект TList, который озаглавли-

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

деструктора объекта TStaffList:

 

Staff.Done;

 

Код деструктора заслуживает более подробного изучения:

 

destructor StaffList.Done;

var

N: TNodePtr;

begin

while TNodes <> nil do

begin

N:= TNodes;

Disрose(N^.Item, Done);

TNodes:= N^.Next;

Disрose (N);

end;

end;


 

B.Pascal 7 & Objects /UG - 239 -

 

 

Список очищается начиная с "головы" списка с помощью алго-

ритма "из руки в руку", который до некоторой степени напоминает

дерганье за веревку воздушного змея: два указателя (указатель

TNodes внутри Staff и рабочий указатель N) изменяют свои ссылки в

списке, тогда как первый элемент списка удаляется. Вызов процеду-

ры Disрose освобождает память, занимаемую первым объектом

TEmployee в списке (Item^), затем TNodes продвигается на следую-

щую запись списка с помощью оператора TNodes:= N^.Next, сама за-

пись TNode удаляется, и процесс продолжается до полного очищения

списка.

 

Важным моментом в деструкторе Done является способ, которым

удаляются из списка объекты TEmployee:

 

Disрose(N.Item, Done);

 

Здесь N.Item является первым объектом TEmployee в списке, а

вызываемый метод Done является деструктором этого объекта. Запом-

ните, что действительный тип N^.Item^ не обязательно является ти-

пом TEmployee, однако он может быть любым дочерним типом типа

TEmployee. Очищаемый объект является полиморфическим и поэтому

нельзя сделать никаких предположений относительно его действи-

тельного размера или точного его типа на этапе компиляции. В при-

веденном выше вызове Disрose, как только Done выполнит все содер-

жащиеся в нем операторы, "невидимый" код эпилога ищет размер реа-

лизации очищаемого объекта в ТВМ этого объекта. Метод Done пере-

дает размер процедуре Disрose, которая затем освобождает точное

количество динамической памяти, в действительности занимаемой по-

лиморфическим объектом.

 

Помните, что если должно освобождаться правильное количество

динамической памяти, то полиморфический объект должен очищаться

только посредством вызова передаваемого Disрose деструктора.

 

В примере программы Staff объявляется как статическая пере-

менная в сегменте данных. Staff мог бы столь же легко разместить-

ся в динамической памяти и "прикрепиться к реальному миру" пос-

редством указателя типа ListPtr. Если заголовок списка также яв-

ляется динамическим объектом, то удаление структуры можно осу-

ществить путем вызова деструктора, выполняющегося внутри Disрose:

 

var

Staff: TStaffListPtr;

begin

Disрose(Staff, Done);

.

.

.

 

Здесь процедура Disрose вызывает метод деструктора Done для

очистки структуры в динамической памяти. Затем, когда Done завер-

шается, Disрose освобождает память, на которую указывает Staff,


 

B.Pascal 7 & Objects /UG - 240 -

 

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

списка.

 

Программа WORKLIST.PAS (находящаяся на вашем диске) исполь-

зует тот же модуль WORKERS.PAS, что и раньше Она создает объект

List, являющийся оглавлением связанного списка из пяти полиморфи-

ческих объектов, совместимых с TEmployee, а затем удаляет всю ди-

намическую структуру данных с помощью единственного вызова дест-

руктора Staff.Done.

 

Что же дальше?

─────────────────────────────────────────────────────────────────

 

Как и во всяком другом аспекте машинного программирования,

вы не преуспеете в объектно-ориентированном программировании, ес-

ли будете только читать о нем, но вы добъетесь результата, если

начнете программировать. Большинство людей, при первом столкнове-

нии с объектно-ориентированном программированием, начинают бормо-

тать с придыханием; "Я не могу постичь этого". "Ага!" приходит

позднее, ночью, когда целостная концепция является к нам в одно

прекрасное мгновение, и мы, побросав свои никчемные дела, исполь-

зуем это мгновение для обращения к богу. Как лицо женщины, возни-

кающее из чернильных пятен Роша, то, что до этого было смутным,

становится очевидным и затем легким.

 

Самое лучшее, что вы можете сделать в качестве первого шага

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

WORKERS.PAS (он находится на вашем диске) и расширить его. Как

только вы воскликните "Ага!", начинайте строить ориентированные

на объекты концепции в вашей повседневной программистской жизни.

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

дый день, и переосмыслите их в ориентированных на объекты терми-

нах. Посмотрите критически на "овощное рагу" вашей библиотеки

процедур и попытайтесь найти в них объекты, затем перепишите про-

цедуры в объектной форме. Вы убедитесь, что библиотеки объектов

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

незначительные ваши начальные инвестиции в программные усилия

станут навсегда излишними. У вас едва ли возникнет необходимость

переписывать объект с самого начала. Если он работает как надо,

то используйте его. Если объекту чего-либо не хватает, то рас-

ширьте его. Но если он работает хорошо, то нет смысла выбрасывать

из него что-либо.

 

Заключение

─────────────────────────────────────────────────────────────────

 

Объектно-ориентированное программирование является прямым

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

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

руки. Наследование и инкапсуляция являются максимально эффектив-

ными средствами для управления сложностью. (Существует разница

между десятью тысячами насекомых, классифицированных по таксоно-

мической схеме, и десятью тысячами насекомых, жужжащих возле ва-


 

B.Pascal 7 & Objects /UG - 241 -

 

ших ушей.) Представляя собой значительно большее, чем просто

структурное программирование, объектно-ориентированное программи-

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

обеспечения ЭВМ, что, как и таксономическая схема, устанавливает

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

 

Добавьте сюда перспективы возможности расширения и повторно-

му использования существующего кода и все это начнет звучать нас-

только хорошо, что будет походить на правду. Вы думаете, что это

невозможно?

 

Но это же Borland Pascal! Слово "невозможно" в нем не опре-

делено.

 

 


 

B.Pascal 7 & Objects /UG - 242 -

 

────────────────────────────────────────────────────────────────────────────

Глава 10. Взгляд на Windows

─────────────────────────────────────────────────────────────────

 

В данной главе содержится обзор программирования для

Microsoft Windows с использованием Borland Pascal (с акцентом на

объектно-ориентированное программирование). В представленном

здесь примере используется поставляемая с Borland Pascal библио-

тека ObjectWindows. Вы узнаете о поведении прикладной программы

Windows и о том, как с помощью ObjectWindows автоматизировать од-

ни задачи и упростить другие.

 

Чтобы извлечь из данной главы максимум пользы, вы должны по-

нимать принципы объектно-ориентированного программирования. Если

вы не знакомы с объектно-ориентированным программированием, про-

читайте Главу 9 "Объектно-ориентированное программирование". Вы

должны также знать, как работать с Windows.

 

 


 

B.Pascal 7 & Objects /UG - 243 -

 

Что такое приложение Windows?

─────────────────────────────────────────────────────────────────

 

На Рис. 10.1 показаны основные компоненты приложения

Windows. Чтобы понять обсуждаемые темы, вам должны быть знакомы

эти компоненты, и вы должны уметь с ними работать.

 

Кнопка минимизации

Кнопка максимизации │

Строка заголовка │ │

Командная кнопка │ │ │

управления меню Строка меню │ Вертикальная полоса │ │

│ │ │ прокрутки │ │ │

▄▄│▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄│▄▄▄▄▄▄▄▄▄▄▄▄│▄▄▄▄▄▄▄▄▄▄▄▄▄│▄▄▄▄▄▄▄▄▄▄▄▄│▄│▄▄

█╔│[]═════════════│════════════│═════════════│════════════│═│╗█

█║▒=▒ │ Borland Pascal │ │^│v║█

█║─────────────────│──────────────────────────│───────────┴─┴─║█

█║ File Edit Search Run Compile Tools Options │indows Help ║█

█║────────────────────────────────────────────│───────────────║█

█║╔═══════════════════════════════════════════│╗ ║█

█║║▒=▒ c:\bpw\helloapp.pas │^││║ ║█

█║║────────────────────────────────────────┴─┴│║ ║█

█║║ program Hello; ^║ ║█

█║║ ▒║ ║█

█║║ uses WObjects, WinTypes, WinProcs; ▒║ ║█

█║║ ▒║ ║█

█║║ type ▒║ ║█

█║║ ▄║ ║█

█║║ { Define a TApplications descendant } ▒║ ║█

█║║ THelloApp = object(TApplication) ▒║ ║█

█║║ procedure InitMa╔════════════════════════════════╗ ║█

█║║ end; │ ║█=██████Go to Line Number███████║ ║█

█║║<▒█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│▒▒▒║ ║ ║█

█║╚════════│═════════│═══║ ▒▒Enter new line number▒█████v ║ ║█

█║ │ │ ║ ║ ║█

█║ │ │ ║ ║ ║█

█║ │ │ ║ ┌────────┐┌────────┐┌────────┐ ║ ║█

█║ │ │ ║ │√ OK ││X Cancel││? Help │ ║ ║█

█║ │ │ ║ └───│────┘└────────┘└────────┘ ║ ║█

█║ │ │ ║ │ │ ║ ║█

█║ │ │ ╚═════│═══════════════│══════════╝ ║█

█║▒▒▒1:1▒▒▒│▒▒Insert▒│▒▒▒▒▒▒▒▒▒│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│▒▒▒▒▒▒▒▒▒▒▒▒▒▒║█

█╚═════════│═════════│═════════│═══════════════│══════════════╝█

███████████│█████████│█████████│███████████████│████████████████

│ │ │ │

│ Окно Управляющий Диалоговое окно

Горизонтальная элемент

полоса прокрутки

 

Рис. 10.1 Выводимые на экран компоненты приложения Windows.

 

Приложение Windows - это специальный тип программы PC, кото-

рая:


 

B.Pascal 7 & Objects /UG - 244 -

 

 

- должна иметь специальный выполняемый формат файла (.EXE);

 

- работать только с Windows;

 

- обычно работать в прямоугольном окне на экране;

 

- при выводе на экран следовать рекомендациям по стандартно-

му интерфейсу с пользователем;

 

- может работать одновременно с другими программами Windows

и прочими программами, включая другие экземпляры самое се-

бя;

 

- может взаимодействовать и совместно использовать данные с

другими приложениями Windows.

 

Преимущества Windows

─────────────────────────────────────────────────────────────────

 

Как для пользователей, так и для разработчиков Windows пред-

лагает множество преимуществ, которые включают в себя:

 

* Стандартные и предсказуемые операторы: если вы знаете, как

использовать одно приложение Windows, то сможете работать

со всеми остальными.

 

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

драйверы устройств и устройства: в Windows предусмотрены

драйверы для поддержки периферийной аппаратуры.

 

* Межпрограммное взаимодействие и связь.

 

* Многозадачность: возможность одновременно запускать мно-

жество программ.

 

* Доступ к большему объему памяти: Windows поддерживает за-

щищенный режим.

 

Для разработчиков эти преимущества включают в себя:

 

* Независимую от устройств графику, благодаря чему графичес-

кие приложения могут работать на всех стандартных дисплей-

ных адаптерах.

 

* Непосредственную поддержку широкого диапазона принтеров,

мониторов и устройств типа "мышь".

 

* Богатую библиотеку графических подпрограмм.

 

* Больше памяти для больших программ.

 

* Поддержку меню, пиктограмм, битовых массивов и др.


 

B.Pascal 7 & Objects /UG - 245 -

 

Требования

─────────────────────────────────────────────────────────────────

 

Обратной стороной ряда предлагаемых Windows пользователю

преимуществ является перечень более строгих аппаратных требова-

ний. В общем случае Windows требует для производительности, срав-

нимой с приложением DOS лучших графических средств, больших объ-

емов памяти, более быстрых процессоров. Если вы располагаете про-

цессором 80286 или старше и не менее 2 мегабайтами памяти, то

Windows будет прекрасно работать.

 

 

Программные средства

─────────────────────────────────────────────────────────────────

 

Для разработчиков прикладных программ Windows предусматрива-

ет широкий диапазон программных средств.

 

 

Архитектура с управлением по событиям

─────────────────────────────────────────────────────────────────


Дата добавления: 2015-09-30; просмотров: 32 | Нарушение авторских прав







mybiblioteka.su - 2015-2024 год. (0.047 сек.)







<== предыдущая лекция | следующая лекция ==>