рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Создание объектов

Работа сделанна в 1999 году

Создание объектов - Курсовая Работа, раздел Программирование, - 1999 год - Объекты Turbo Pascal 7.0 Создание Объектов. В Турбо Паскале Для Создания Объектов Используется ...

Создание объектов.

В Турбо Паскале для создания объектов используется три зарезервированных слова object, constructor, destructor и три стандартные директивы private, public и virtual. Зарезервированное слово object используется для описания объекта. Описание объекта должно помещаться в разделе описания типов type MyObject object поля объекта методы объекта end Если объект порождается от какого-либо родителя, имя родителя указывается в круглых скобках сразу за словом object type MyDescendantObject object MyObject end Любой объект может иметь сколько угодно потомков, но только одного родителя, что позволяет создавать иерархические деревья наследования объектов.

Для данной учебной задачи создадим объект-родитель TGraphObject, в рамках которого инкапсулированы поля и методы, общие для всех остальных объектов type TGraphObj object Private поля объекта будут скрыты от пользователя X,Y Integer координаты реперной точки Color Word цвет фигуры Public Constructor Init aX, aY Integer aColor Word создат экзепляр объекта Procedure Draw aColor Word Virtual вычерчивает объект заданным цветом aColor Procedure Show показывает объект вычерчивает его цветом Color Procedure Hide прячет объект вычерчивает его цветом фона Procedure MoveTo dX, dY Integer перемещает объект в точку с координатами XdX и YdY end конец описания объекта TGraphObj В дальнейшем предполагается создать объекты-потомки от TGraphObject, реализующие все специфические свойства точки, линии, окружности и прямоугольника.

Каждый из этих графических объектов будет характеризоваться положением на экране поля X и Y и цветом поле Color. С помощью метода Draw он будет способен отображать себя на экране, а с помощью свойств показать себя метод Show и спрятать себя метод Hide сможет перемещаться по экрану метод MoveTo. Учитывая общность свойств графических объектов, мы объявляем абстрактный объект TGraphObj, который не связан с конкретной графической фигурой.

Он объединяет в себе все общие поля и методы реальных фигур и будет служить родителем для других объектов.

Директива Private в описании объекта открывает секцию описания скрытых полей и методов. Перечисленные в этой секции элементы объекта не видны программисту, если этот объект он получил в рамках библиотечного TPU-модуля. Скрываются обычно те поля и методы, к которым программист в его же интересах не должен иметь непосредственного доступа. В данном примере он не может произвольно менять координаты реперной точки X,Y, т.к. это не приведт к перемещению объекта.

Для изменения полей X и Y предусмотрены входящие в состав объекта методы Init и MoveTo. Скрытые поля и методы доступны в рамках той программной единицы программы или модуля, где описан соответствующий объект. В дальнейшем предполагается, что программа будет использовать модуль GraphObj с описанием объектов. Скрытые поля будут доступны в модуле GraphObj, но недоступны в использующей его основной программе.

Разумеется, в рамках реальной задачи создание скрытых элементов объекта вовсе необязательно. В объект TGraphObj они введены лишь для иллюстрации возможностей ООП. Директива public отменяет действие директивы private, по этому все следующие за public элементы объекта доступны в любой программной еденице. Директивы private и public могут произвольным образом чередоваться в перделах одного объекта. Варианты объявления объекта TGraphObj без использования механизма private public type TGraphObj object X,Y Integer Color Word Constructor Init aX,aY Integer aColor Word Procedure Draw aColor Word Virtual Procedure Show Procedure Hide Procedure MoveTo dX,dY Integer end Описания полей ничем не отличаются от описания обычных переменных.

Полями могут быть любые структуры данных, в том числе и другие объекты. Используемые в данном примере поля X и Y содержат координату реперной характерной точки нрафического объекта, а поле Color его цвет. Реперная точка характеризует текущее положение графической фигуры на экране и, в принципе, может быть любой е точкой в данном примере она совпадает с координатами точки в описываемом ниже объекте TPoint, с центром окружности в объекте TСircle, первым концом прямой в объекте TLine и с левым верхним углом прямоугольника в объекте TRect. Для описания методов в ООП используются традиционные для Паскаля процедуры и функции, а так же особый вид процедур конструкторы и деструкторы.

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

Зарезервированное слово constructor, используемое в заголовке конструктора вместо procedure, предписывает компилятору создать особый код пролога, с помощью которого настраивается так называемая таблица виртуальных методов см. ниже. Если в объекте нет виртуальных методов, в нм может не быть ни одного конструктора, наоборот, если хотя бы один метод описан как виртуальный с последующим словом Virtual, см метод Draw, в состав объекта должен входить хотя бы один конструктор и обращение к конструктору должно прежшествовать обращению к любому виртуальному методу. Типичное действие, реализуемое конструктором, состоит в наполнеии объектных полей конкретными значениями.

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

В данном примере конструктор Init объекта TGraphObj получает все необходимые для полного определения экземпляра данные через параметры обращения aX, aY, aColor. Процедура Draw предназначена для вычерчивания графического объекта. Эта процедура будет реализовываться в потомках объекта TGraphObj по-разному. Например, для визуализации точки следует вызвать процедуру PutPixel, для вычерчивания линии процедуру Line и т.д. В объекте TGraphObj процедура Draw определена как виртуальная воображаемая. Абстрактный объект TGraphObj не предназначен для вывода на экран, однако наличие процедуры Draw в этом объекте говорит о том, что любой потомок TGraphObj должен иметь собственный метод Draw, с помощью которого он может показать себя на экране.

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

В данном примере ТВМ объекта TGraphObj хранит единственный элемент адрес метода Draw. Первоначально элементы ТВМ не содержат конкретных адресов. Если бы мы создали экземпляр объекта TGraphObj с помощью вызова его конструктора Init, код пролога конструктора поместил бы в ТВМ нужный адрес родительского метода Draw. Далее мы создадим несколько потомков объекта TGraphObj. Каждый из них будет иметь собственный конструктор, с помощью которого ТВМ каждого потомка настраивается так, чтобы е единственный элемент содержал адрес нужного метода Draw. Такая процедура называется поздним связыванием объекта.

Позднее связывание позволяет методям родителя обращаться к виртуальным методам своих потомков и использовать их для реализации специфичных для потомков действий. Наличие в объекте TGraphObj виртуального метода Draw позволяет легко реализовать три других метода объекта чтобы показать объект на экране в методе Show, вызывается Draw с цветом aColor, равным значению поля Color, а чтобы спрятать графический объект, в методе Hide вызывается Draw со значением цвета GetBkColor, т.е. с текущим цветом фона. Рассмотрим реализацию перемещения объекта.

Если потомок TGraphObj например, TLine хочет переместить себя на экране, он обращается к родительскому методу MoveTo. В этом методе сначала с помощью Hide объект стирается с экрана, а затем с помощью Show показываетя в другом месте.

Для реализации своих действий и Hide, и Show обращаются к виртуальному методу Draw. Поскольку вызов MoveTo происходит в рамках объекта TLine, используется ТВМ этого объекта и вызывается его метод Draw, вычерчивающий прямую. Если бы перемещалась окружность, ТВМ содержала бы адрес метода Draw объекта TСircle и визуализация-стирание объекта осуществлялась бы с помощью этого метода. Чтобы описать все свойства объекта, необходимо раскрыть содержимое объектных методов, т.е. описать соответствующие процедуры и функуии.

Описание методов производится обычным для Паскаля способом в любом месте раздела описаний, но после описания объекта. Например type TGraphObj object end Constructor TGraphObj. Init begin X aX Y aY Color aColor end Procedure TGraphObj. Draw begin Эта процедура в родительском объекте ничего не делает, поэтому экземплялры TGraphObj не способны отображать себя на экране. Чтобы потомки объекта TGraphObj были способны отображать себя, они должны перекрывать этот метод end Procedure TGraphObj. Show begin Draw Color end Procedure TGraphObj. Hide begin Draw GetBkColor end Procedure TGraphObj. MoveTo begin Hide X XdX Y YdY end Отмечу два обстоятельства. Во-первых, при описании методов имя метода дополняется спереди именем объекта, т.е. используется составное имя метода.

Это необходимо по той простой причине, что в иерархии родственных объектов любой из методов может быть перекрыт в потомках. Составные имена чтко указывают принадлежность конкретной процедуры.

Во-вторых, в любом объектном методе можно использовать инкапсулированные поля объекта почти так, как ели бы они были определены в качестве глобальных переменных. Например, в конструкторе TGraph. Init переменные в левых частях операторов присваивания представляют собой объектные поля и не должны заново описываться в процедуре. Более токо, описание Constructor TGraph. Init var X,Y Integer ошибка Color Word ошибка begin end вызовет сообщение о двойном определении переменных X, Y, Color в этом и состоит отличие в использовании полей от глобальных переменных глобальные переменные можно переопределять в процедурах, в то время как объектные поля переопределять нельзя.

Стоит обратить внимание на то, что абстрактный объект TGraphObj не предназначен для выводя на экран, поэтому его метод Draw ничего не делает. Однако методы Hide, Show, MoveTo знают формат вызова этого метода и реализуют необходимые действия, обращаясь к реальным методам Draw своих будущих потомков четез соответствующие ТВМ. Это и есть полтморфизм объектов.

Создадим простейшего потомка от Tgraphobj объект TРoint, с помощью которого будет визуализироваться и перемещаться точка. Все основные действия, необходимые для этого, уже есть в объекте TGraphObj, поэтому в объекте TPoint перекрывается единственный метод Draw type TPoint object TGraphObj Procedure Draw aColor Virtual end Procedure TPoint. Draw begin PutPixel X,Y,Color показываем цветом Color пиксель с координатами X и Y end В новом объекте TРoint можно использовать любые методы объекта-родителя TGraphObj. Например, вызвать метод MoveTo, чтобы переместить изображение точки на новое место. В этом случае родительский метод TGraphObj. MoveTo будет обращаться к методу TPoint. Draw, чтобы спрятать и затем показать изображение точки.

Такой вызов станет доступен после обращения к конструктору Init объекта TРoint, который нужным образом настроит ТВМ объекта. Если вызвать TPoint. Draw до вызова Init, его ТВМ не будет содержать правильного адреса и программа зависнет.

Чтобы создат объект-линию, необходимо ввести два новых поля для хранения координат другого конца. Дополнительные поля требуется наполнить конкретными значениями, поэтому нужно перекрыть конструктор родотельского объекта type TLine object TGraphObj dX, dY Integer Приращение координат второго конца Constructor Init X1, Y1, X2, Y2 Integer aColor Word Virtual end Constructor TLine. Init Вызывает унаследованный конструктор TGraphObj для инициации полей X, Y, Color. Затем инициирует поля dX, dY begin Вызываем унаследованный конструктор Inherited Init X1, Y1, aColor Инициируем поля dX, dY dX X2-X1 dY Y2-Y1 end Procedure Draw begin SetColor Color Устанавливаем цвет Color Line X, Y, XdX, YdY Вычерчиваем линию end В конструкторе TLine. Init для инициации полей X, Y, Color, унаследованных от родмтельского объекта, вызывается унаследованный конструктор TGraph. Init, для чего используется зарезервированное слово inherited англ. унаследованный Inherited Init X1, Y1, aColor C таким же успехом мы могли бы использовать и составное имя метода TGraphObj. Init X1, Y1, aColor Для инициации полей dX и dY вычисляется расстояние в пикселах по горизонтали и вертикали от первого конца прямой до е второго конца.

Это позволяет в методе TLine. Draw вычислить координаты второго конца по координатам первого и смещениям dX, dY. В результате простое изменение координат реперной точки X,Y в родительском методе TGraph. MoveTo перемещает всю фигуру по экрану. Теперь нетрудно реализовать объект TСircle для создания и перемещения окружности type TCircle object TGraphObj R Integer Constructor Init aX, aY, aR Integer aColor Word Procedure Draw aColor Virtual end Constructor TCircle. Init begin Inherited Init aX, aY, aColor R aR end Procedure TCircle. Draw begin SetColor aColor устанавливает цвет Color Circle X, Y, R вычерчивает окружность end В объекте Trect, с помощью которого создатся и перемещается прямоугольник, учтм то обстоятельство, что для задания прямоугольника требуется указать четыре целочисленных параметря, т.е. столько же, сколько для задания линии.

Поэтому объект TRect удобнее породить не от TGraphObj, а от TLine, чтобы использовать его конструктор Init tipe TRect object TLine Procedure Draw aColor Word end Procedure TRect. Draw begin SetColor aColor Rectangle X, Y, XdX, YdY вычерчиваем прямоугольник end Чтобы описания графических объектов не мешали созданию основной программы, оформим эти описания в отдельном модуле GraphObj Unit GraphObj Interface интерфейсная часть модуля содержит только объявления объектов type TGraphObj object end TPoint object TGraphObj end TLine object TGraphObj end TCircle object TGraphObj end TRect object Tline end Implementation исполняемая часть содержит описания всех объектных методов Uses Graph Constructor TGraphObj. Init end. В интерфейсной части модуля приводятся лишь объявления объектов, подобно тому как описываются другие типы данных, объявляемые в модуле доступными для внешних программных едениц.

Расшифровка объектных методов помещается в исполняемую часть implementation, как если бы это были описания обычных интерфейсных процедур и функций.

При описании методов можно опускать повторное описание в заголовке параметров вызова.

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

Например, заголовок конструктора TGraphObj. Init может быть таким Сonstructor TGraphObj. Init или таким Сonstructor TGraphObj. Init aX, aY Integer aColor Word 5.

– Конец работы –

Эта тема принадлежит разделу:

Объекты Turbo Pascal 7.0

Появление этой идеи было следствием недостаточной изученности алгоритмической стороны вычислительных процессов, стольхарактерной для ранних… Последовательное использование идеи процедурного структурирования программ… По мере прогресса в области вычислительной математики акцент в программировании стал смещаться с процедур в сторону…

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Создание объектов

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Основные принципы ООП
Основные принципы ООП. Объектно-ориентированное программирование основано на трх китах трх важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследован

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

Использование объектов
Использование объектов. Идею инкапсуляции полей и алгоритмов можно применить не только к графическим объектам, но и ко всей прграмме в целом. Ничто не мешает нам создать объект-программу и н

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги