Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Л3 Объектно-ориентированное программирование.doc
Скачиваний:
2
Добавлен:
10.11.2019
Размер:
62.46 Кб
Скачать

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

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

Объектно-ориентированное программирование (ООП) представляет собой новый этап развития современных концепций построения языков программирования. Многие понятия объектно-ориентированного программирования выглядят достаточно непривычно для программистов не сталкивавшихся с ними ранее.

В основе ООП лежит понятие объекта, сочетающего в себе данные и действия над ними.

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

В язык программирования 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. Что называют методами объекта?

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

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

Традиционный стиль программирования допускает два решения. Во-первых, можно ввести для круга совершенно новую структуру, повторив в ней (может быть, под другими именами) те же поля X, Y и Visible и добавив новое поле Radius. Во-вторых, можно скоструировать структуру для круга, использовав в ней поле с типом, ранее определённым для точки (сделать "структуру в структуре"). Оба подхода вполне приемлемы, однако объектно-ориентированное программирование предполагает иной подход, который по ряду причин является гораздо более предпочтительным.

Объектно-ориентированный стиль позволяет определить новый объект как потомок другого ранее определённого типа. Это означает, что новый тип автоматически получает все поля и методы ранее введённого типа, который в этом случае называется предком или родительским типом. В этом случае в определении типа-потомка должно быть указано (в круглых скобках после служебного слова object) имя родительского типа:

Circle = object (Point)

Radius: integer;

end;

Задание родительского типа означает, что в объектовом типе Circle неявно присутствуют все поля из типа Point; аналогично, для переменной нового типа доступны все методы из Point:

var

OneCircle: Circle;

begin

OneCircle.Init(100,200);

OneCircle.Radius := 30;

. . .

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

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

type

Ring = object (Circle)

Radius2: integer;

end;