78196

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

Лекция

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

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

Русский

2015-02-07

117.5 KB

4 чел.

екция: Объектно-ориентированное программирование: объект, наследование, инкапсуляция, полиморфизм    с. 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.  Дайте определение понятиям «инкапсуляция», «полиморфизм», «наследование». Приведите примеры.


 

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

55738. Моя сім’я, моя родина – це рідна область, Україно! 52 KB
  Формувати знання дітей про значення здоров’я розуміння необхідності дружби зі спортом. Прищеплювати гігієнічні навички встановити взаємозв’язок між здоров’ям дітей та майбутнім країни.
55739. Семья и семейные ценности 104.5 KB
  Цель: показать ценности семьи и семейные традиции в русской классической литературе на примере романа Л.Н. Толстого «Война и мир»; формировать представление о психологических особенностях семьи, помочь в осознании семейных ценностей
55740. Яку роль відіграє у житті людини родинне коло 130.5 KB
  Мета: Уточнити розширити поглибити уявлення дітей про сім’ю родину рід їх значення в житті людини пробуджувати пізнавальний інтерес до історії свого родоводу формувати навички толерантного поводження в у сім’ї...
55741. Яке значення має для людини сім’я 47.5 KB
  Мета: Ознайомити учнів із поняттям сім’я; з’ясувати значення сім’ї для людини поговорити про те як слід уникати конфліктів у сім’ї...
55742. Твій родовід, піклування про здоров’я в родині 72 KB
  Слово вчителя Діти коли ви чуєте чи вимовляєте це слово кого ви уявляєте діти називають слова; вчитель будує на дошці асоціативний кущ: брат дідусь тато тітка мама сестра СІМ’Я...
55743. Рід, родина, родовід 48.5 KB
  Обладнання: мультимедійні засоби фонограми з записами українських народних пісень столи для команд дзвоники для подачі сигналу про відповідь аркуші паперу ручки секундомір грамоти для нагородження учасників.
55744. Інтегрований урок з української і світової літератури у 8-му класі 135.5 KB
  Про яку літературну героїню сьогодні ми будемо вести розмову Вчитель світової літератури: Виконуючи кожний етап уроку ми з пазлів зберемо в одну цілісну картину образ двох Роксолан. Учителі прикріплюють перший пазл до плакату портрет...
55745. Роль загадок, ребусов, стихов, кроссвордов в развитии познавательной компетентности на уроках истории и во внеурочное время (из опыта работы) 176 KB
  Композиция всех без исключения загадок двухчастная: первая часть вопрос вторая ответ. Это хорошо видно на примере загадок вопросов загадок задач и загадок складок рифма выступает в качестве подсказки.
55746. Рольова гра «Стратегія успіху» 51.5 KB
  Мета. Активізувати у старшокласників процес життєвого, професійного самовизначення, формувати активну життєву установку, навички моделювання, планування та рефлексії...