Модуль 7. Объектно - ориентированное программирование 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Модуль 7. Объектно - ориентированное программирование



 

Тип объект.

 

Объект можно рассматривать как усовершенствование типа запись, в которой описание свойств и параметры моделируемой сущности дополняются методами - описаниями действий с объектом. В отличие от записи объект объявляется словом object.

Пример: создадим простейший объект: позицию на экране в графическом режиме:

program oop;

uses graph;

type pozicia = object

x, y: integer;

procedure init (xn, yn: integer);

procedure locate (var xl, yl: integer);

end;

procedure pozicia.init;

begin

x:=xn;

y:=yn;

end;

procedure pozicia.locate;

begin

xl:=x;

yl:=y;

end;

var d, r, xx, yy: integer;

p: pozicia;

begin

d:=detect;

randomize;

initgraph (d, r, 'c:\tp\bgi');

p.init (random(GetMaxX), random(GetMaxY));

closegraph;

p.locate (xx, yy);

write (xx, yy);

end.

 

 

Инкапсуляция.

 

Одним из главных свойств ООП является инкапсуляция - замыкание в общей оболочке (Object…end) всех составляющих описания. При этом поля оказываются глобальными для методов данного объекта, т.к. у полей и методов общая область действия, то совпадение имен полей и формальных параметров методов не допустимо. Блоки-методы вынесены за описание типа объект. Имена блоков-методов, принадлежащих разным типам могут совпадать. Даже при совпадении имен заголовки методов будут различны, т.к. состоят из префикса (имени типа) и имени метода.

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

 

 

Наследование.

 

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

<имя типа потомка>=object(<имя типа отца>)

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

Важной деталью использования наследования в программах является применение присваивания объектам значений объектов. Присваивание A:=B допустимо, если A и B - однотипны, A - предок B или для каждого поля A есть соответствующее поле в B.

 

 

Полиморфизм.

 

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

constructor <имя блока> (<список формальных параметров>)

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

Задача: тип kom - сын типа pozicia представляет закрашенные квадраты с длиной стороны raz (в пикселах). Наследуемые поля x, y являются координатами центра квадрата. Процедура kom.zoom увеличивает (уменьшает) объект если аргумент znak>0 (znak<=0). Длина raz изменяется на 2*delt, где delt - еще один аргумент.

uses graph, crt;

type pozicia = object

x, y: integer;

procedure init (xn, yn: integer);

procedure locat (var xl, yl: integer);

end;

kom=object (pozicia)

cvet, raz: word;

procedure init (xn, yn: integer; color: word);

procedure zoom (delt, znak: integer);

end;

procedure pozicia.init;

begin

x:=xn;

y:=yn;

end;

procedure pozicia.locat;

begin

xl:=x;

yl:=y;

end;

procedure kom.init;

begin

pozicia.init (xn, yn);

cvet:=color;

raz:=1;

end;

procedure kom.zoom;

var j, d: integer;

begin

if znak>0 then setcolor (cvet)

else setcolor (getBkcolor);

for j:=1 to delt do

begin

if znak>0 then raz:=raz+2;

d:=raz div 2;

moveto (x-d, y-d);

linerel (d+d, 0);

linerel (0, d+d);

linerel (-d-d, 0);

linerel (0, -d-d);

if (znak<=0) and (raz>1) then raz:=raz-2;

end;

end;

const n=50;

var j, d, r, xx, yy: integer;

kvad: array [1..n] of kom;

begin

d:=detect;

randomize;

initgraph (d, r, 'c:\tp\bgi');

for j:=1 to n do

kvad[j].init (random(GetMaxX), random(GetMaxY), random(GetMaxColor);

repeat

delay (100);

j:=random (n)+1;

kvad[j].zoom(random(8)+1, random(3)-1);

until kepressed;

closegraph;

kvad[1].locat (xx, yy);

write (xx, ' ', yy);

readln;

end.

 

 



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 64; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.237.255 (0.012 с.)