Главная/Раздел  5

 

 

Главная

 

 Раздел 1

 

Раздел 2

 

Раздел 3

 

Раздел 4

 

Раздел 5

 

 
 

 

 

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

Исторически сложилось так, что программирование возникло и развивалось как процедурное (структурное) программирвание. Процедурное программирование предполагает, что основой программы является алгоритм, процедура обработки данных. Объектно-ориентированное программирование (ООП) представляет собой новый этап развития современных концепций построения языков программирования. Многие понятия объектно-ориентированного программирования выглядят достаточно непривычно для программистов не сталкивавшихся с ними ранее. В основе ООП лежит понятие объекта, сочетающего в себе данные и действия над ними. В настоящее время объектно-ориентированная технология программирования получила широкое распространения. Существуют языки программирования, для которых ООП является методологической основой, - так называемые чистые объектно-ориентированные языки. Кроме того, к настоящему времени многие распространённые языки, первоначально рассчитанные на традиционный подход к программированию, содержат ряд объектно-ориентированных расширений. В язык программирования Turbo Pascal объектно-ориентированное расширение было внедрено фирмой Borland начиная с версии 5.5.

Объектовые типы. Классы.

Для использования объектов в разделе объявления типов необходимо объявить объектовый тип, который в объектно-ориентированной терминологии чаще называют классом. С формальной точки зрения, объектовые типы (классы) в языке Turbo Pascal очень похожи на комбинированные типы (записи). Объектовые типы (классы) также являются составными типами, элементы (поля) которых могут иметь любой тип. Так, простейший пример объектового типа выглядит следущим образом:

     Type
       Point = object
            X, Y: integer;
         Visible: boolean;
               end;

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

Объекты-переменные (объекты)

В дальнейшем введённый таким образом тип Point (или любой другой класс) можно использовать в программе обычным образом: определять переменные этого типа (как статически - посредством описателя var, - так и динамически, создавая экземпляр переменной этого типа с помощю стандартной процедуры New), работать с полями и т.д.

Методы объекта

Важнейшим и радикальным отличием от обычных комбинированных типов является возможность, наряду с полями, задавать в объектовом типе подпрограммы - процедуры и функции. В этом и заключается одна из основных идей объектно-ориентированного подхода к программированию: предполагается, что объект содержит не только информацию (в предыдущем примере - координаты точки и признак её "видимости"), но и правила работы с этой информацией, оформленные в виде выполняемых фрагментов. Такими правилами могут быть, например, операция создания точки (установка значений координат), а также операции "включения" и "выключения" точки и перемещения её в другое место экрана. Подпрограммы, определённые в объектовом типе, называются методами объекта (methods).

Технически определение подпрограмм в объектовых типах делается так: непосредственно в объектовом типе задаются только заголовки подпрограмм-методов, а полные их описания должны быть заданы отдельно, причём имя подпрограммы-метода формируется из имени объектового типа - "хозяина", символа "точка" и имени подпрограммы, например:

   Type
     Point = object          {объектовый тип, класс  "точка" }
      X, Y: integer;                   {поле координаты}
      Visible: boolean;                {поле видимость}
      procedure Create (a, b: integer);{метод определение координат}
      procedure SwithOn;               {метод вкл. видимость}
      procedure SwithOff;              {метод выкл. видимость}
      procedure Move (dx, dy: integer);{метод переместить}
      function GetX: integer;          {метод вернуть координату x}
      function GetY: integer;          {метод вернуть координату y}
            end;

     procedure Point.Create (a,b: integer);
     begin
      X:=a; Y:=b;
      Visible := false;
     end;

     Procedure Point.SwithOn;
     begin
      Visible := true;
      PutPixel(X,Y,Getcolor);
     end;      

Такое разделение диктуется, во-первых, необходимостью достижения большей наглядности определения объектового типа; во-вторых, становится возможным определение таких типов как интерфейсных элементов модуля. В этом случае полные описания подпрограмм-методов могут быть размещены в разделе реализации модуля. Несмотря на выделение методов из определения объектового типа, в телах методов считаются доступными идентификаторы полей этого объектового типа (заметим, что методы объекта должны быть заданы ПОСЛЕ указания всех его полей). Таким образом, объединение в одном понятии информации о некотором реальном объекте-прототипе (в примере - точки на экране дисплея) и операций над ним делает объектовый тип замкнутой самодостаточной сущностью, содержащей все требуемые знания о конкретном элементе прикладной области. Имея вышеприведённое описание, можно определять в программе экземпляры объектов, например:

     var
       OnePoint: Point;
и в дальнейшем оперировать с этим экземпляром посредством его методов:
     OnePoint.Create(100,200);
     OnePoint.SwithOn;
     OnePoint.Move(20,-10);

Оператор присоединения with

Для объектовых типов так же, как и для записей, допускается использование оператора присоединения.

     with OnePoint do begin
        Create(100,200);
        SwithOn;
        Move(20,-10);
                      end;

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

Некоторые особенности использования ООП.

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

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

Объединение в одном объекте данных (параметров) и их методов (действий над ними), в объектно-ориентированном программировании называется инкапсуляцией. Инкапсуляция - первое основное свойство объекта.

Пример

В качестве примера рассмотрим программу, в которой применяется описанный выше класс Point. Светящаяся точка перемещается по экрану с помощью клавиш со стрелками. Клавишей F1 включается и выключается её видимость.

PROGRAM EX_35_1;
USES Crt, Graph;
TYPE
     Point = object          {объектовый тип, класс  "точка" }
             X, Y: integer;                   {координаты}
             Visible: boolean;                {видимость}
             procedure Create (a, b: integer);{определение координат}
             procedure SwithOn;               {вкл. видимость}
             procedure SwithOff;              {выкл. видимость}
             procedure Move (dx, dy: integer);{переместить}
             function GetX: integer;          {вернуть координату x}
             function GetY: integer;          {вернуть координату y}
             function GetV: boolean;          {вернуть видимость}
            end;

     procedure Point.Create (a,b: integer);
     begin
      X:=a; Y:=b;
      Visible := false;
     end;

     Procedure Point.SwithOn;
     begin
      Visible := true;
      PutPixel(X,Y,GetColor);
     end;

     Procedure Point.SwithOff;
     begin
      Visible := false;
      PutPixel(X,Y,GetBkColor);
     end;

     Procedure Point.Move (dx, dy: integer);
     var a,b :integer;
     begin
       a:=x+dx;
       b:=y+dy;
       if visible then putpixel(x,y,GetBkColor);
       if a>639 then x:=639 else
       if a<0   then x:=0 else x:=a;
       if b>479 then y:=479 else
       if b<0   then y:=0 else y:=b;
       if visible then putpixel(x,y,GetColor);
     end;

     function Point.GetX: integer;
     begin
      GetX:=X;
     end;

     function Point.GetY: integer;
     begin
      GetY:=Y;
     end;

     function Point.GetV: boolean;
     begin
      GetV:=Visible;
     end;

VAR
     Gd,Gm: integer;
     ch: char;
     Pt: Point;

BEGIN
     Gd:=Vga;
     Gm:=VgaHi;
  InitGraph(Gd,Gm,'');
  If GraphResult=GrOk then
  Begin

     Pt.Create(320,240);
     Pt.SwithOn;
     Repeat
     ch := readkey;
      if ch=#0 then begin
     ch := readkey;
     case ch of
{вверх}  #72: Pt.Move(0,-1);
{вниз}   #80: Pt.Move(0,1);
{влево}  #75: Pt.Move(-1,0);
{вправо} #77: Pt.Move(1,0);
{F1}     #59: if Pt.GetV then Pt.SwithOff else Pt.SwithOn;
     end; {case}
                   end;
     Until ch=#13;
  End;
  Closegraph;
END.

Контрольные вопросы.

  1. Что называют объектовым типом (классом)?
  2. Что называют объектом?
  3. Что такое инкапсуляция?
  4. Как объявляются объектовые типы (классы) в Turbo Pascal?
  5. Что называют методами объекта?

Задания для самостоятельного выполнения.

  1. Напишите программу с объектом треугольник, передвигающимся из левой части экрана в правую?
  2. Напишите программу с объектом "пульсирующая" окружность?
  3. Напишите прогармму с объектом "прямоугольник", размеры которого можно изменять в ходе работы программы.
  4. Напишите программу с объектом "линия", передвигающимя с нижней части экрана в верхнюю часть экрана.
  5. Напишите программу с объектом "бегущая строка", содержимое которой можно изменять в ходе работы программы.

НАЗАД                    ДАЛЕЕ          

 

 

 

 

 

 

 

 

 :::

 

 :::

 

 

 

 

 

 

 

Сайт создан в системе uCoz