Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабораторные на Pasca (Кудрявцев)l

.pdf
Скачиваний:
32
Добавлен:
18.03.2015
Размер:
1.63 Mб
Скачать

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

243

 

 

В описании происходит обращение к родительским методам Init и Show, при этом для методов объекта потомка сохранены старые на- именования, хотя текст процедур стал иным. Использование одина- ковых имен методов для порожденных объектов называется поли- морфизмом и отражает важное свойство ООП. Оно заключается в том, что под наследованием правила для всей иерархии порожден-

ных объектов подразумевается конкретное логическое действие над объектами, а не способ его реализации. Так метод Init описывает инициализацию полей объекта, независимо от его типа.

Созданные объекты удобно хранить в отдельном модуле, подклю- чая его к программе с помощью стандартной директивы Uses. На- помним, что модуль в Турбо Паскале имеет стандартную структуру программы, но начинается не служебным словом Program, а словом Unit, после которого идет имя модуля. Описание объектов распола- гается в секции модуля INTERFACE, а описание методов в секции IMPLEMENTATION. Для наших объектов модуль выглядит следую- щим образом:

Unit Student;

INTERFACE Type

Str= string; Data=byte; StudentType=object Famaly: Str; Name: Str;

Grup: Str;

Procedure Init(Fm,Nm,Gr: Str); Procedure Show;

end;

DataType=object(StudentType) DataMath: Data;

DataPhis: Data;

DataInf: Data;

Procedure Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data); Procedure Show;

end;

IMPLEMENTATION

Procedure StudentType.Init(Fm,Nm,Gr: Str);

Begin

Famaly:=Fm;

Name:=Nm;

Grup:=Gr;

244

Лабораторная работа № 22

 

 

End;

Procedure StudentType.Show; Begin

Writeln;

Writeln('ФАМИЛИЯ: ',Famaly); Writeln('ИМЯ: ',Name); Writeln('ГРУППА: ',Grup); End;

Procedure DataType.Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data); Begin

StudentType.Init(Fm,Nm,Gr);

DataMath:=Mt;

DataPhis:=Ph;

DataInf:=Inf;

End;

Procedure DataType.Show; Begin

StudentType.Show; Writeln('МАТАНАЛИЗ: ',DataMath); Writeln('ОБЩАЯ ФИЗИКА: ',DataPhis); Writeln('ИНФОРМАТИКА: ',DataInf); End;

BEGIN

END.

Теперь модуль следует сохранить в файле с таким же именем (в нашем случае в файле Student.pas). Соответственно, исполняемая программа примет вид:

Program Stud;

USES Student; var

NameStd: StudentType; DataStd: DataType; Begin

NameStd.Init('Иванов','Петр','544'); NameStd.Show; DataStd.Init('Иванов','Петр','544',3,5,4); DataStd.Show;

End.

Напомним, что компиляцию данной программы необходимопроиз- водить в режиме Make или Build опции COMPILER.

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

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

245

 

 

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

Статические правила сильно привязаны к типу объекта, для которо- го они были введены. Этого недостатка лишены виртуальные пра- вила. Подобно динамическим переменным виртуальные правила не имеют полного определения в памяти до непосредственного вы- полнения программы. При их объявлении добавляется зарезервиро- ванное слово Virtual:

Procedure Show; virtual;

Следует помнить, что, однажды определив правило как виртуаль- ное, необходимо определять его таковым и для всех объектов- потомков.

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

Type PStudentType=^StudentType; PDataType=^DataType;

var

PNamStd: PStudentType; PDataStd: PDataType;

Обращение к динамическим объектам становится возможным толь- ко после выделения памяти в куче (Heap). Это можно сделать, ис- пользуя стандартную процедуру New:

New(PDataStd);

После этого обращение к экземпляру объекта производится с по- мощью соответствующей переменной-указателя PDataStd^. Так, чтобы проинициализировать поля экземпляра объекта PDataStd^, достаточно выполнить следующее обращение:

PDataStd^.Init(‘Иванов’,’Петр’,’543’,2,4,3);

Необходимость инициализации любого объекта и некоторая шаб-

лонность необходимых для этого действий привели к появлению в Турбо Паскале двух новых зарезервированных слов Constructor и Destructor. В синтаксис стандартных процедур New и Dispose добав-

246

Лабораторная работа № 22

 

 

лен второй необязательный параметр-указатель на специальное правило объекта. Это правило носит название конструктор и пред- назначено для размещения динамического объекта в памяти и ини- циализации его полей. Для его описания и используется ключевое слово Constructor, заменяющее слово Procedure. Выделение памяти для динамического объекта PDataStd с одновременной инициализа-

цией его полей осуществляется с помощью процедуры

New(PDataStd, Init(‘Иванов’,’Петр’,’543’,2,4,3));

Обратиться к New можно и как к функции:

PDataStd := New(PDataType, Init(‘Иванов’,’Петр’,’543’,2,4,3));

Результатомфункционального вызова New будет значение указате- ля на распределенный динамический объект в куче. Соответствен- но, вместо первого параметра используется тип указателя на объ- ект.

Деструктор предназначен для очистки и освобождения из памяти динамических объектов с помощью расширенного вызова стан- дартной процедуры Dispose . При этом объем освобождаемой памя- ти точно соответствует размеру объекта. Для нашего примера текст деструктора имеет вид:

Destructor StudentType.Done; Begin

End;

Destructor DataType.Done; Begin

End;

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

Dispose(PDataStd, Done);

С учетом всех сделанных выше замечаний наш модуль Student при-

нимает вид

Unit Student;

INTERFACE Uses Crt; Type

Str= string; Data=byte;

PStudentType=^StudentType;

StudentType=object Famaly: Str; Name: Str;

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

247

 

 

Grup: Str;

Constructor Init(Fm,Nm,Gr: Str); Destructor Done; virtual; Procedure Show; virtual; Procedure ShowClrScr;

end;

PDataType=^DataType;

DataType=object(StudentType) DataMath: Data;

DataPhis: Data;

DataInf: Data;

Constructor Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data); Destructor Done; virtual;

Procedure Show; virtual; end; IMPLEMENTATION

Constructor StudentType.Init(Fm,Nm,Gr: Str); Begin

Famaly:=Fm;

Name:=Nm;

Grup:=Gr;

End;

Procedure StudentType.Show; Begin

Writeln;

Writeln('ФАМИЛИЯ: ',Famaly); Writeln('ИМЯ: ',Name); Writeln('ГРУППА: ',Grup); End;

Constructor DataType.Init(Fm,Nm,Gr: Str; Mt,Ph,Inf: Data); Begin

StudentType.Init(Fm,Nm,Gr);

DataMath:=Mt;

DataPhis:=Ph;

DataInf:=Inf;

End;

Procedure DataType.Show; Begin

StudentType.Show; Writeln('МАТАНАЛИЗ: ',DataMath); Writeln('ОБЩАЯ ФИЗИКА: ',DataPhis); Writeln('ИНФОРМАТИКА: ',DataInf); End;

Procedure StudentType.ShowClrScr; Begin

ClrScr;

248

Лабораторная работа № 22

 

 

Show;

End;

Destructor StudentType.Done; Begin

End;

Destructor DataType.Done; Begin

End;

BEGIN

END.

Исполняемая же часть программы может быть записана в виде:

Program Stud;

USES Student; var

NameStd: StudentType; DataStd: DataType; PStudent: PStudentType; PData: PDataType; Begin

DataStd.Init('Иванов','Петр','544',3,5,4); DataStd.ShowClrScr; New(PData,Init('Иванов','Петр','544',3,5,4)); NameStd.Init('Петров','Иван','545'); PStudent:=@NameStd;

PStudent^.Show;

PStudent:=PData;

PStudent^.Show;

Dispose(PStudent,Done);

End.

Задания для самостоятельнойработы

Просмотрите выполнение программы Stud в пошаговом режиме (опции

RUN/GO TO CURSOR и RUN/STEP OVER), следя за изменением полей объектов (опция DEBUG/WATCHES/ADD WATCH).

Создайте объект-потомок объекта DataType, содержащий дополни- тельное поле Stipend со значениями Yesи No’.

249

Лабораторная работа № 23

ЭЛЕМЕНТЫ TURBO VISION

Рассмотренный в предыдущей работе пример создания программы с использованием основных методов ООП (объектно-ориентиро- ванного программирования), несмотря на его простоту и невырази- тельность, демонстрирует, тем не менее, многие преимущества та- кого подхода:

1.Становится совершенно прозрачной структура исполняемой части программы. Программа, написанная с использованием прин- ципов ООП, должна выполнить три основных действия: инициали- зировать объект (процедура Init), показать объект (процедура Show), закрыть объект (процедура Done).

2.Создание объекта отделено от написания кода программы. Для того, чтобы использовать созданный объект, совсем не нужно знать, как выглядят включенные в него методы, то есть как устроен блок IMPLEMENTATION соответствующего модуля вполне доста- точно сведений о том какие поля имеются у объекта и какими ме- тодами он располагает. В этом смысле объектв ООП действи- тельно объект он имеет определенную формуи знает, как себя вести”.

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

Ясно, что указанные преимущества могут проявиться в полной ме- ре лишь при написании сложных программ, требующих многократ- ного повторения сходных действий. Примером таких программ мо- гут служить программы, требующие разветвленного пользователь- ского интерфейса системы меню, строк-подсказок, окон помощи, окон ввода данных и так далее. Понятно, насколько бы упростилось создание подобных программ, если бы в нашем распоряжении име- лась библиотека соответствующих объектов. Turbo Vision и есть та- кая библиотека! Если Вы работаете в текстовом режиме (хотя Turbo Vision не исключает, естественно, графических возможностей Паскаля), то в этой библиотеке Вы найдете все, что нужно для соз-

250

Лабораторная работа № 23

 

 

дания Вашей программы. Разветвленное иерархическое дерево Turbo Vision позволяет найти плодна любой вкус. Поэтому нельзя не присоединиться к призыву разработчиков Turbo Vision – не изо- бретайте колесо, наследуйте наше!

На самом высоком уровне Turbo Vision – это объединение видимых элементов, событий и невидимых объектов.

Видимый элемент – это любой элемент программы, который ви- ден на экране. Все видимые элементы являются объектами. Под- робнее эти объекты мы рассмотрим ниже. Отметим только, что все видимые объекты имеют прямоугольную форму, так как Turbo Vision работает в текстовом режиме.

События это все то, на что должна отреагировать Ваша про- грамма. События могут приходить от мышки, от клавиатуры или от других частей Turbo Vision. Они поступают в очередь внутри Turbo Vision по мере их поступления и затем обрабатываются обработчи- ком событий. Объект TАpplication, который является ядром любой программы, содержит обработчик событий. Если событие не может быть обработано TАpplication, то оно передается в другие видимые элементы до тех пор, пока не найдется объект, который обработает событие или пока не возникнет ошибка отказ от события”.

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

Что собой представляют видимые объекты, Вы можете увидеть на экране монитора после загрузки Турбо Паскаля 6.0, поскольку его IDE (интегрированная среда разработки программ) создана на осно-

ве Turbo Vision.

Вы видите, прежде всего, DeskTop (панель экрана или рабочий стол) – большой прямоугольник заштрихованный светлым фоном. Сверху располагается полоса меню, доступ к которой осуществля- ется нажатием клавиши F10, клавиши Alt с любой литерной клави- шей, выделенной красным цветом горячие» клавиши), или с по- мощью мыши. Активизация любой команды меню приводит к по- явлению дополнительных выпадающих меню. Здесь Вы можете пе-

Элементы Turbo Vision

251

 

 

ремещаться с помощью курсорных клавиш или литерных «горя- чих» клавиш (без Alt).

Внизу расположена строка статуса, которая содержит наиболее

часто употребляемые команды и может использоваться для вывода различного рода сообщений и подсказок о текущем состоянии сис- темы (ее статусе).

При выборе команды New в меню File панель экрана перекрывается окном. Окно имеет рамку с именем и управляющие кнопки вверху. Левая закрывает окно (при ее нажатии мышкой), правая изменяет размеры, раскрывая окно на полный экран или сворачивая до прежних размеров. Нажав клавишу мыши на верхней стороне рам- ки, Вы можете мышью перемещать окно по экрану. Потянув мыш- кой за правый нижний угол окна, можно изменять его размеры.

При отсутствии мышки те же действия можно выполнить и с кла- виатуры. Для этого можно войти в меню Window (Окно) или сразу воспользоваться горячейклавишей Ctr+F5, после чего курсорны-

ми клавишами можно перемещать окно или изменять его размеры (при нажатой клавише Shift). Обратите внимание на то, как при этом изменяется статусная строка. Клавиша F5 распахивает окно на полный экран или восстанавливает его прежние размеры (разумеет- ся, если они были меньше полных). Закрыть окно можно командой Close из меню Window или комбинацией клавиш Alt+F3.

С помощью команды New из меню File Вы можете раскрыть какое угодно число новых окон. Расположить на экране их можно либо каскадом (Cascade из меню Windows) либо мозаикой (Tile). Переход от окна к окну осуществляется командой Next, клавишей F6 или нажатием клавиши Alt и цифры, соответствующей номеру окна (по- следнее возможно лишь для первых 9 окон, остальные не нумеро- ваны). Естественно, что нужное окно можно выбрать и мышкой (IDE – «мышиная» система, все действия с помощью мыши осуще- ствляются проще и быстрее).

Окно имеет полосу прокрутки (скроллинга), позволяющую про-

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

252

Лабораторная работа № 23

 

 

Войдя, например, в меню Options и выбрав в нем команду Linker, Вы получите еще один пример видимого элемента диалоговое окно. Оно окрашено в другой цвет и содержит некоторый текст, управ- ляющие кнопки и другие элементы. Существуют различные типы диалоговых окон, с которыми мы познакомимся позже.

Управляющие кнопки могут быть нажаты мышкой. Одна из кнопок выделена цветом надписи (в нашем случае кнопка Ok) и является кнопкой по умолчанию она нажимается клавишей Enter. Сменить кнопку по умолчанию можно клавишей Tab.

После знакомства с основными элементами Turbo Vision можно пе- рейти к написанию Вашей первой программы, воспользовавшись рекомендациями разработчиков Turbo Vision.

Как уже отмечалось, основным объектом при составлении про- грамм в Turbo Vision является TАpplication (он описан в модуле АPP.TPU). Это абстрактный объект, который сам ничего не делает. Если выполнить программу:

program MyFirst; uses App;

var

MyApp: TApplication; BEGIN

MyApp.Init;

MyApp.Run;

MyApp.Done;

END.

то можно увидеть этот объект в «чистом виде» – он создает панель экрана и активизирует клавишу выхода Alt+X. Кроме того, из при- веденного примера видно, что в Turbo Vision принято соглашение называть процедуру инициализации объекта Init, процедуру вывода на экран Run и процедуру закрытия объекта Done. Эти три про- цедуры и составляют исполняемую часть практически любой про- граммы в Turbo Vision. На самом деле метод Run сложнее он включает в себя не только вывод объектов на экран, но и обработку событий.

Поскольку объект TApplication слишком прост, Вам придется моди- фицировать его, то есть создавать объекты-потомки, расширяя его поля и перекрывая его методы. Посмотрим, прежде всего, как из-