Главная / Лекции / Основы алгоритмизации и программирования

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

7.1. Тип объект.

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



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

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


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

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


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

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


назад     содержание     вперед     на главную


Rambler's Top100
Hosted by uCoz