русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Private


Дата добавления: 2013-12-23; просмотров: 697; Нарушение авторских прав


Public

Uses CRT, Graph;

Program Pix_And_Ring;

End;

Begin

. . . . . . . . . . .

End;

Begin

. . . . . . . . . . .

End;

Begin

Begin

End;

Begin

End;

Begin

End;

Begin

End.

ReadLn;

Begin

End;

Begin

End;

Begin

End;

Begin

End;

Begin

Uses CRT, Graph;

Program Tochka;

End.

ReadLn;

Delay(1000);

Begin

Uses CRT, Graph;

Program Tochka;

Var x, y, dx, dy: Word;

driver, regim: Integer;

driver:=detect;автоопределение графического драйвера

InitGraph(Driver,Regim,'C:\BP\BGI');инициализация графическогорежима

SetBkColor(1);цвет фона - синий

ClearDevice;очистка экрана

SetColor(14);цвет фигур - желтый

x:=100;x и y – координаты точки

y:=150;

dx:=50; dx и dy – шаги по координатам

dy:=100;

PutPixel(x,y,14);рисуем точку желтым цветом

Delay(1000);задержка 1 сек

PutPixel(x,y,1);там же рисуем точку цветом фона

x:=x + dx;делаем шаг по координатам

y:=y + dy;

PutPixel(x,y,14);рисуем желтую точку на новом месте

CloseGraph;закрываем графический режим

Эта программа создана классическими методами с использованием переменных и процедур для работы с графическими объектами.



 

 

Создадим объект, включающий:

поляx и y – его координаты,

методыInitинициализация – задание начальных значений координат,

Show – появление объекта на экране,

Hide – скрытие объекта,

Move – перемещение объекта на один шаг по координатам.

Поля объекта называются его свойствами. Для описания объектов в Паскале используется специальный тип Object:

Type TPix = Object

x, y: Word;координаты точки

Procedure Init(a, b: Word);инициализация объекта:aиb –его начальные координаты

Procedure Show;появление объекта

Procedure Hide;скрытие объекта

Procedure Move(da, db: Word);перемещение объекта: daиdb –шаги по координатам

End;

Procedure TPix.Init;инициализация

x:=a; xиy –глобальные переменные

y:=b; aиb –входные переменные(формальные параметры) – начальные координаты объекта

Procedure TPix.Show; появление

PutPixel(x,y,14);помещаем желтую точку по координатамxиy

Procedure TPix.Hide; скрытие

PutPixel(x,y,1); помещаем синюю (цвет фона) точку по координатамxиy

Procedure TPix.Move;перемещение

Hide;скрытие

x:=x + da;изменение координат

y:=y + db; xиy –глобальные переменные

daиdb –входные переменные(формальные параметры) – шаги по координатам

Show;появление

Var x0, y0, dx, dy: Word;

driver, regim: Integer;

pixel: TPix; создаем экземпляр объекта – переменную pixel

driver:=detect;автоопределение графического драйвера

InitGraph(Driver,Regim,'C:\BP\BGI');инициализация графическогорежима

SetBkColor(1);цвет фона - синий

ClearDevice;очистка экрана

SetColor(14);цвет фигур - желтый

x0:=100; x0 и y0 – начальные координаты точки

y0:=150;

dx:=50; dx и dy – шаги по координатам

dy:=40;

pixel.Init(x0, y0); инициализация точки: задаем начальные координаты точки

pixel.Show; выводим точку на экран по заданным координатам

Delay(1000); пауза в 1 сек

Pixel.Move(dx, dy); перемещаем точкуна dx,dy

Delay(1000); пауза в 1 сек

CloseGraph;закрываем графический режим

 

Таким образом:

1. в объекте TPix объединены описания его полей (свойств) и методов – инкапсуляция,

2. доступ к свойствам объекта возможен только через его методы; непосредственное обращение к полям противоречит принципам объектно-ориентированного программирования!

3. поведение объекта полностью определяется его методами Init, Show, Hide, Move,

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

5. перед началом работы с экземпляром объекта (точкой) необходима его инициализация – задание начальных координат точки.

Рассмотрим понятие наследования: используя объект TPix, создадим объект TRing для рисования и перемещения окружности, добавив в новый объект поле rad – радиус окружности и переопределив для нее методы Init, Show, Hide, доставшиеся от родительского типа. Это означает, что в обоих типах будут использованы методы с одними и теми же именами, но с различной реализацией.Поля x и y новый объект унаследует от старого – это будут координаты центра окружности:

Type TRing = Object (TPix) объект TRing – потомокобъекта TPix

rad: Word;радиус окружности

Procedure Init(a, b, r: Word);инициализация объекта:aиb –координатыего центра, r – его радиус

Procedure Show;появление объекта

Procedure Hide;скрытие объекта

End;

Procedure TRing.Init;переопределеннаяинициализация

x:=a; x, y, rad –глобальные переменные

y:=b; a, b, r –входные переменные(формальные параметры) –координаты центра объекта и его радиус

rad:=r;

Procedure TRing.Show; переопределенноепоявление

SetColor(14); цвет фигуры - желтый

Circle(x,y,rad);помещаем желтую окружность по координатамxиy

Procedure TRing.Hide; переопределенноескрытие

SetColor(1); цвет фигуры – синий (цвет фона)

Circle(x,y,rad);помещаем синюю окружность по координатамxиy

Далее поместим головную программу:

Var x0, y0, dx, dy, radius: Word;

driver, regim: Integer;

ring: TRing; создаем экземпляр объекта – переменную ring

driver:=detect;автоопределение графического драйвера

InitGraph(Driver,Regim,'C:\BP\BGI');инициализация графическогорежима

SetBkColor(1);цвет фона - синий

ClearDevice;очистка экрана

SetColor(14);цвет фигур - желтый

x0:=100; x0 и y0 – начальные координаты центра окружности

y0:=150;

dx:=50; dx и dy – шаги по координатам

dy:=40;

radius:=10; радиус окружности

ring.Init(x0, y0, radius); инициализация окружности: задаем начальные координаты ее центра и радиус

ring.Show; выводим окружность на экран по заданным координатам

Delay(1000); пауза в 1 сек

ring.Move(dx, dy); перемещаем окружностьна dx,dy

Метод ring.Move не был определен при описании объекта TRing, поэтому будет вызван метод родительского объекта pixel.Move – на экране переместится точка, а не окружность.

Таким образом, если метод объекта-предка не переопределен в объекте-потомке, то будет работать метод объекта-предка.

Вспомним описание этого метода:

Procedure TPix.Move;перемещение

Hide;скрытие

x:=x + da;изменение координат

y:=y + db;

Show;появление

Можно заметить, что метод Move обращается к методам Show и Hide. Смысл этих обращений очевиден: сначала объект делается невидимым на экране (вызывается метод Hide), задаются его новые координаты, и он снова делается видимым (вызывается метод Show). Что произойдет, если метод Move использовать в программе одновременно с двумя экземплярами различных объектов: pixel и ring?

Метод Move наследуется объектом TRing от объекта TPix, а методы Hide и Show, поскольку сокрытие и показ окружности на экране осуществляются не так, как точки, в объекте TRing переопределяются с добавлением новой глобальной переменной rad и заданием цвета фигуры. Для точки при этом никаких осложнений не возникнет, поскольку все вызываемые методы Init, Show и Hide являются для нее родными.

Что касается окружности, то при вызове метода Ring.Move система пытается обнаружить метод с таким же именем в описании объекта TRing, и, не найдя его, продолжает поиски в объекте-предке TPix. В результате имеет место обращение к методу предка pixel.Move. После этого из метода Move вроде бы должны быть вызваны переопределенные методы ring.Hide и ring.Show. Однако этого не происходит: из унаследованного метода pixel.Move экземпляр объекта ring вместо ring.Hide и ring.Show вызывает одноименные методы объекта TPix: pixel.Hide и pixel.Show.

Это объясняется тем, что методы pixel.Move, pixel.Hide и pixel.Show жестко связаны, поскольку они были откомпилированы в едином контексте – объектном типе TPix. Другими словами, связь между этими методами, которая была установлена при компиляции, имеет статический характер. Поэтому в этом случае будет перемещаться точка, а не окружность.

Как сделать так, чтобы методы Hide и Show вызывались в зависимости от того, экземпляр какого объекта обращался к методу Move?

В этом случае используется механизм динамического (позднего) связывания – в отличие от статического (раннего) связывания. Указанный механизм реализуется с помощью виртуальных методов: заголовок виртуального метода в описании объекта-предка дополняется словом Virtual:

Procedure TPix.Show;Virtual;

Procedure TPix.Hide;Virtual;

Если в потомках этого объектного типа имеются переопределенные методы (методы с тем же именем), то они тоже должны быть объявлены в описании этих потомков как виртуальные и при этом иметь тот же набор формальных параметров, что и метод объекта-предка:

Procedure TRing.Show;Virtual;

Procedure TRing.Hide;Virtual;

В данном случае методы инициализации и перемещения объектов виртуальными не объявляются!В методах же инициализации экземпляров объектов Init вместо слова Procedure используется слово Constructor:

a) для объекта Tpix :

Constructor Init(a, b: Word);

Constructor TPix.Init;

x:=a;

y:=b;

b) для объекта Tring :

Constructor Init(a, b, r: Word);

Constructor TRing.Init;

x:=a;

y:=b;

rad:=r;

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

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

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

Итак, для каждого типа объекта (класса объектов) создается только одна таблиц виртуальных методов, а отдельные экземпляры объекта содержат только адрес этой таблицы. Значение этого адреса и устанавливается процедурой, называемой конструктором. В ней вместо слова Procedure используется слово Constructor.

Таким образом:

· конструктор определяется в каждом объектном типе, имеющем виртуальные методы,

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

· конструктор, помимо описанных в нем действий, устанавливает связь между объектом и таблицей виртуальных методов, содержащей адреса кодов, которые реализуют виртуальные методы,

· сам конструктор виртуальным быть не может.

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

Type TRing = Object (TPix) объект TRing – потомокобъекта TPix

Private скрытые

rad: Word;радиус окружности

Public общедоступные

Constructor Init(a, b, r: Word);инициализация объекта:aиb –координатыего центра, r – его радиус

Private скрытые

Procedure Show;появление объекта

Procedure Hide;скрытие объекта

End;

Скрытыми объявлены: поле rad, процедуры Show и Hide. Общедоступен конструктор Init. Каждая очередная директива Private и Public отменяет действие предыдущей. Если в описании типа указанных директив вообще нет, то все поля и методы считаются общедоступными.

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

Полная программа, использующая два объектных типа TPix и TRing, свойства инкапсуляции, наследования, полиморфизма, виртуальные методы и конструкторы, может выглядеть так:

Type TPix = Object

Private

x, y: Word;координаты точки

Constructor Init(a, b: Word);инициализация объекта:aиb –его начальные координаты

Procedure Show; Virtual;появление объекта

Procedure Hide; Virtual;скрытие объекта



<== предыдущая лекция | следующая лекция ==>
Объектно-ориентированное программирование | Основы алгебры логики


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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