78196

Объектно-ориентированное программирование: объект, наследование, инкапсуляция, полиморфизм

Лекция

Информатика, кибернетика и программирование

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

Русский

2015-02-07

117.5 KB

6 чел.

екция: Объектно-ориентированное программирование: объект, наследование, инкапсуляция, полиморфизм    с. 8 из 8

  1.  

Оглавление

[1] Оглавление

[1.1] Введение

[1.2] Определение объектов

[1.3] Инкапсуляция

[1.4] Наследование

[1.5] Полиморфизм

[1.6] Контрольные вопросы

Урок-лекция №28

Введение 

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

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

Определение объектов

Объект – это структура, компонентами которой являются данные-поля объекта и процедуры (функции) - методы объекта. Все данные и методы инкапсулированы в одном объекте.

Определение типа ОБЪЕКТ:

TYPE ИмяОбъекта = OBJECT

Поля данных;

Заголовки методов;

 END;

Все поля данных предшествуют методам. Поля – любые структуры данных кроме файлов. Например,

Type TPerson=Object

 Name : string[20];

 Address : string[40];

Procedure Init(n,a : string);

End;

Var Student : TPerson;

В примере объявлены объектный тип TPerson и переменная Student. Переменная Student – это экземпляр объектного типа. Очевидно, что объект Student представляет собой структуру, которая состоит их двух полей строкового типа – Name и  Address.

Все поля предшествуют методам. Полями могут быть любые структуры данных, кроме файлов.

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

Пример:

Type TPerson =Object

 Name : string[20];

 Address : string[40];

 Procedure Init(n,a:string);

 Procedure Show;

 Function GetAddress:string;

 End;

Var Person : TPerson;

В примере объявлены два метода-процедуры Init и Show и метод-функции GetAddress. Метод Init предназначен для инициализации полей объекта, метод Show предназначен для вывода содержимого полей объекта на экран, метод  GetAddress обеспечивает доступ к полю Address.

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

Переменную, описываемую типом ИмяОбъекта, называют экземпляром объекта:

VAR ЭкземплярОбъекта : ИмяОбъекта;

В программе может быть сколько угодно экземпляров одного объекта. Вызов метода – это оператор (или выражение) вида:

<ИмяЭкземпляраОбъекта>.<ИмяМетода>[<СписокФактическихПараметров>]

Например,

Procedure TPerson.Init(n,a:string);

Begin

 Name:=n;

 Address:=a;

End;

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

Например,  в результате выполнения Student.Show; будет применен метод Show, в результате чего на экран будет выведено содержимое полей объекта Student.

Вместо прямого доступа к полям следует использовать методы. Например,

Type TPerson =Object

 Procedure Init(n,a:string);

 Function GetName:string;

 Function GetAddress:string;

 Procedure SetAddress(NewAddress:string);

 End;

В объявлении типа TPerson включены объявления методов. Метод Init обеспечивает инициализацию объекта. Метод SetAddress позволяет изменить значение поля Address, методы GetName и  GetAddress – получить значения соответствующих полей.

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

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

Для защиты полей объекта от прямого доступа используют директиву private (частный, закрытый от других). Ее помещают перед объявлением полей, прямой доступ к которым надо запретить. Объявления частных полей метода помещают после объявления обычных (доступных) полей и методов типа. Например,

Type

 TPerson =Object

 Procedure Init(n,a:string);

 Function GetName:string;

 Function GetAddress:string;

 Procedure SetAddress(NewAddress:string);

Private

 Name : string;

 Address : string;

 End;

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

Пример 1. Рассмотрим пример использования объектов при работе с символьной и текстовой информацией в текстовом режиме. На нижнем уровне определения типов объектов будем использовать переменные (X1,Y1) и (X2,Y2) - координаты углов окна, X,Y – переменные, определяющие позицию курсора в окне, C – цвет окна. Для задания значений координат углов окна и цвета фона будем использовать процедуру INIT, которая полям X1,Y1,X2,Y2,С присваивает передаваемые значения. Для задания значений, определяющих позицию курсора в окне, используем процедуру INIT1. Процедуру SHOW будем использовать для изображения окна.

USES CRT;

TYPE TypeWin = OBJECT

х1,y1,x2,y2,c : integer;

х,y  :integer;

Procedure INIT(ax1,ay1,ax2,ay2,ac:integer);

Procedure INIT1(ax,ay:integer);

Procedure SHOW;

End;

{реализация методов}

Procedure TypeWin.INIT;

Begin

x1:=ax1; y1:=ay1; x2:=ax2; y2:=ay2; c:=ac

End;

Procedure TypeWin.INIT1;

Begin

x:=ax; y:=ay

End;

Procedure TypeWin.SHOW;

Begin

TextBackground(c);

Window(x1,y1,x2,y2);

ClrScr

End;

{описание экземпляров объекта}

Var O1 : TypeWin;

{операторная часть программы или с оператором WITH}

Begin

{ можно использовать

O1.INIT(10,5,50,20,red);  

O1.SHOW;     

или использовать with…}  

With O1 do  

Begin

INIT(10,5,50,20,red);

SHOW;

End;

Readln;

End.

В рассмотренном примере поля x,y и метод INIT1 не использовались. Они будут использоваться на следующем уровне определения объектов.

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

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

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

При вызове метода прямого Предка в версии Турбо Паскаль 7.0 достаточно предварительно указать ключевое слово INHERITED (унаследованный).

Синтаксически наследование выражается следующим образом:

Type ИмяОбъектаНаследника= OBJECT(ИмяОбъектаПредка)

  Новые поля объекта наследника;

Новые методы объекта наследника;

 END;

Продолжим рассмотрение примера 1. При помощи типа объекта TypeWin можно задавать значения координат для указания позиции выводимого элемента. Добавим новые действия: а) установить значение выводимого элемента и б) вывести элемент с заданной позиции на экран.

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

{Для символа}

Type TypeSym = OBJECT(TypeWin)

Ch:char;

Procedure INIT1(ax,ay:integer; ach:char);

Procedure SHOW1;

END;

Procedure TypeSym.INIT1;

Begin

Inherited INIT1(ax,ay);

Ch:=ach

End;

Procedure TypeSym.SHOW1;

Begin

GoToXY(x,y);

Writeln(ch)

End;

{Для строки}

Type TypeStr = OBJECT(TypeWin)

S : String;

Procedure INIT1(ax,ay:integer; as:char);

Procedure SHOW1;

END;

Procedure TypeStr.INIT1;

Begin

Inherited INIT1(ax,ay);

S:=as

End;

Procedure TypeStr.SHOW1;

Begin

GoToXY(x,y);

Writeln(s)

End;

{описание экземпляров новых типов объектов}

Var och : TypeSym;

Os : TypeStr;

{пример возможных операторов после добавления новых объектных типов и новых описаний}

Begin

Och.INIT(10,5,50,20,red);

Och.INIT1(10,2,’!’);

Och.SHOW;

Och.Show1;

Os.INIT1(3,2,’привет’);

Os.Show1;

Readln

End.

Из программы видно, что одноимённые методы INIT1 и SHOW1 содержатся в разных объектовых типах TypeSym и TypeStr. Связь объекта с нужным методом (размещение ссылок на методы) устанавливается в процессе компиляции, так что операторы och.init1, os.init1 (а также och.show1 и os.show1) выполняют вызов разных методов. Говорят, что происходит раннее связывание. Методы, с которыми осуществляется раннее связывание, называют статическими. Действие компилятора сводится к следующему:

1) при вызове метода компилятор устанавливает тип объекта, вызывающего метод;

2) в пределах найденного типа объекта компилятор ищет нужный метод, и, найдя его, назначает вызов метода;

3) если метод в пределах типа объекта не найден, то компилятор устанавливает тип непосредственного прародителя и там ищет метод и т.д.;

4) если вызванный метод нигде не найден, выдаётся сообщение об ошибке.

Можно продолжить ряд наследования. Добавим поле, соответствующее цветовому атрибуту символа, и расширим методы INIT1 и SHOW1. Новый объектовый тип, производный от TypeSym, может быть представлен в следующем виде:

Type TypeSymCol=OBJECT(TypeSym)

Color : Integer;

Procedure INIT1(ax,ay,acolor:integer; ach:char);

Procedure SHOW1;

End;

Procedure TypeSymCol.INIT1;

Begin

Inherited Init1(ax,ay,ach);

Color:=acolor

End;

Procedure TypeSymCol.SHOW1;

Begin

TextColor(color);

Inherited Show1

End;

{Описание экземпляра нового объектового типа:}

Var OchCol : TypeSymCol;

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

Och.Init(10,5,50,20,red);

Och.Init1(2,3,’о’);

Och.Show; Och.Show1;

OchCol.Init1(3,3,yellow,’!’);

OchCol.Show1.

Экземпляры объектов Och и OchCol вызывают различные одноимённые методы Init1 и Show1, причём метод Init1 в объектовых типах Och и OchCol имеет разное количество параметров.

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

Пример 2. Рассмотрим пример использования объектов в графическом режиме. Опишем на нижнем уровне тип объекта для показа, стирания и передвижения по экрану точки с заданным цветовым атрибутом с и координатами изображения x,y. На следующем уровне добавим необходимые описания для выполнения тех же действий с окружностью. Наследуемые поля x,y будут соответствовать координатам центра окружности, добавленное поле r –радиусу окружности. Все методы в типе объекта наследника переопределим, сохранив за ними старые имена. На том же уровне наследования можно в дальнейшем расширить круг наследников, определив типы объектов для работы, например, с линией, прямоугольником и другими фигурами.

Uses Crt, Graph;

Var gd,gm:integer;

Type Tp=Object

X,y,c : integer;

Procedure Init(ax,ay,ac:integer);

Procedure Show;

Procedure Hide;

Procedure Moveto(dx,dy:integer);

End;

Procedure Tp.Init;

Begin

X:=ax; y:=ay; c:=ac

End;

Procedure Tp.Show;

Begin

Putpixel(x,y,c);

End;

Procedure Tp.Hide;

Begin

Putpixel(x,y,Getbkcolor)

End;

Procedure Tp.Moveto;

Begin

Delay(1000); Hide;

X:=x+dx; y:=y+dy;

Show

End;

Type Tc=Object(Tp)

R : integer;

Procedure Init(аx,ay,ac,ar : integer);

Procedure Show;

Procedure Hide;

Procedure Moveto(dx,dy : integer);

End;

Procedure Tc.Init;

Begin

Inherited Init(ax,ay,ac);

R:=ar

End;

Procedure Tc.Show;

Begin

Setcolor(c);

Circle(x,y,r)

End;

Procedure Tc.Hide;

Begin

Setcolor(Getbkcolor);

Circle(x,y,r)

End;

Procedure Tc.Moveto;

Begin

Delay(1000); Hide;

X:=x+dx; y:=y+dy;

Show

End;

Var  P : Tp;

 C : Tc;

Gd,gm: integer;

Begin {main program}

Gd:=Detect;

Initgraph(Gd,Dm,’c:\bp\bgi’);

P.Init(100,120,yellow);

P.Show; P.Moveto(50,50);

Readln;

C.Init1(200,300,Green,150);

C.Show; C.Moveto(10,10);

Readln;

Closegraph

End.

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

O1:=Och; O1:=Os;{в прмере 1}

P:=C;           {в примере2}

При этом копируются (присваиваются) только те поля, которые являются общими для обоих типов.

Полиморфизм

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

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

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

Например. Пусть приведены три типа объектов и три переменные-указателя на эти типы:

Type

TPerson =Object

FName : string[25];

FAddress : string[25];

End;

TStud =object( TPerson)

FGroup : integer;

Procedure Print;

End;

TProf =object(TPerson)

FKaf : integer;

Procedure Print;

End;

Var Pperson: ^TPerson;

Pstud  : ^TStud;

Pprof  : ^TProf;

Для приведенного определения следующие инструкции присваивания являются верными:

Pperson:= Pstud;

Pperson:= Pprof;

Описанное свойство указателей на объектные типы позволяет организовать список студентов и преподавателей как массив указателей на объектный тип TPerson, например, так: Spisok : array[1..n] of  ^TPerson;

Тогда инструкция For i:=1 to n do Spisok[i]^.print; выведет на экран список преподавателей и студентов. Элемент массива может быть указателем на TStud  или на TProf. Поэтому нельзя заранее сказать какой из методов будет вызван – TStud.Print или TProf.Print Решение о выборе метода принимается во время выполнения программы.

Изложенный выше пример вывода студентов и преподавателей демонстрирует концепцию полиморфизма, которая состоит в том, что при применении метода к объекту используется именно тот метод, который соответствует типу объекта.

Ниже приведена программа, иллюстрирующая понятие «полиморфизм». Программа сначала формирует список, состоящий из объектов типа TStudent и Tprofessor, затем, применяя метод Print к элементам массива, выводит этот список на экран.

Program PolVir;

Const lenlist =10; {длина списка}

Type TPerson =Object

FName : string[30];

FAddress : string[40];

Procedure Init(Name, Address : string); {конструктор объекта}

Procedure Done; {деструктор объекта}

Procedure Print;

End;

TStudent =object( TPerson)

FGroup : integer;

Procedure Init(Name, Address : string; Group: integer);

Procedure Done; Procedure Print;

End;

TProfessor =object( TPerson)

FKafedra : string[30];

Procedure Init(Name, Address, Kafedra : string);

Procedure Done; Procedure Print;

End;

PStudent=^Tstudent;

PProf=^TProfessor;

Procedure TPerson.Init(Name, Address: string);

Begin

FName:=Name;

FAddress:= Address;

End;

Procedure TPerson.Done;

Begin

End;

Procedure TPerson.Print;

Begin

Writeln(FName);

Writeln(FAddress);

End;

Procedure TStudent.Init(Name, Address: string;Group:integer);

Begin

TPerson.Init(Name,Address);

FGroup:=Group;

End;

Procedure TStudent.Done;

Begin

End;

Procedure TStudent.Print;

Begin

TPerson.Print;

Writeln(‘гр. ’,FGroup);

End;

Procedure TProfessor.Init(Name, Address, Kafedra: string);

Begin

TPerson.Init(Name,Address);

FKafedra:=Kafedra;

End;

Procedure TProfessor.Done;

Begin

Inherited Done;

End;

Procedure TProfessor.Print;

Begin

TPerson.Print;

Writeln(‘каф. ’,Fkafedra);

End;

Var list : array[1..lenlist] of ^TPerson;

I: integer;

Begin {инициализация списка}

For i:=1 to lenlist do list[i]:=NIL;

{создать пять объектов и поместить в список}

List[1]:=new(PStudent,Init(‘Михаил Иванов’,’Лесной пр., д.29’,238);

List[2]:=new(PStudent,Init(‘Иван Жук’,’Весенняя ул., д.2, кв.17’,133);

List[3]:=new(PProf,Init(‘Игорь Манин’,’Некрасова ул., д.45, кв.8’,’ПОИТ’);

List[4]:=new(PProf, Init(‘Нина Непомнящая’,’Ромашковая ул., д.12,кв.10’,’ПОИТ’);

List[5]:=new(PStudent,Init(‘Кузьма Прутков’,’Долгобродская ул., д.2, корп.2, кв.17’,473);

{вывести объекты – элементы списка}

For i:=1 to lenlist do

If list[i] <> NIL then list[i]^.print;

{уничтожить объекты}

For i:=1 to lenlist do

If list[i] <> NIL then

Begin

Dispose(list[i],Done); {разрушение объекта}

List[i]:=Nil;

End;

Readln;

End.

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

  1.  Опишите основные понятия – объект, класс.
  2.  Дайте определение понятиям «инкапсуляция», «полиморфизм», «наследование». Приведите примеры.


 

А также другие работы, которые могут Вас заинтересовать

70790. HTTP - Hypertext Transfer Protocol 156.45 KB
  Протокол передачи гипертекста HTTP является протоколом прикладного уровня для распределенных мультимедийных информационных систем. Это объектно-ориентированный протокол, в первую очередь используемый для World-Wide Web...
70792. Проблемы мотивации и стимулирования труда персонала (на примере ЗАО «Разрез Евтинский») 640 KB
  Задачи: изучить теоретические основы мотивации и стимулирования работников в организации; провести анализ системы мотивации и стимулирование труда работников ЗАО «Разрез Евтинский»; изучить действие мотивационного и стимулирующего механизма в процессе управления персоналом...
70794. Реализация личностно ориентированного подхода при обучении детей технике спортивных движений 493.5 KB
  Только через деятельность могут быть реализованы основные функции обучения и только посредством деятельности может быть достигнут необходимый результат Г. Основные функции обучения логически вытекают из задач которые общество ставит перед народным образованием схематически...
70795. Правовые основы организации местного самоуправления на примере Новгородской области 351.5 KB
  Цель работы - выявить проблемы, с которыми сталкивается местное самоуправление и проанализировать состояние его правовой основы на примере определенной территории. В связи с обозначенной целью дипломная работа будет решать следующие задачи: рассмотреть становление местного самоуправления...
70796. СОВЕРШЕНСТВОВАНИЕ УЧЕТА И НАЛОГООБЛОЖЕНИЯ В ООО «ДАЛЬВУД СЕВЕР» 169.26 KB
  Цели и задачи определяют структуру данной ВКР, которая состоит из трех частей. Первая часть посвящена анализу упрощенной системы налогообложения в РФ. Во второй части дана характеристика финансовой деятельности организации. В третьей части проследим совершенствование учета...
70797. Учет кредитов и займов в коммерческом банке 99.27 KB
  Актуальность данной работы видится в том что у предприятий всех форм собственности всё чаще объективно возникает потребность привлечения заемных средств для осуществления своей деятельности и извлечения прибыли.
70798. Государственные гарантии и социальные стандарты в системе социальной защиты населения 379 KB
  Социальная сфера - это пространство сложных социальных отношений и связей между различными элементами социума по поводу их социального статуса, равенства и неравенства в обществе. Один из основателей социологической науки О.Конт, указывал та то, что изучать отдельные...