78196

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

Лекция

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

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

Русский

2015-02-07

117.5 KB

7 чел.

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


 

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

52908. Essen. Meine Lieblingsspeise 51 KB
  L.: Guten Tag, liebe Freunde! Ich freue mich, euch zu sehen! Heute arbeiten wir zum Thema „Essen“. Alle Leute haben ihre Lieblingsspeisen, nicht wahr? Wir werden heute über unsere Essengewohnheiten sprechen! Ich hoffe, dieses Thema ist für euch interessant. Also heute lesen wir einen Text, machen verschiedene Übungen, diskutieren über unsere Essengewohnheiten.
52909. Математична естафета: «Острів скарбів» Гра для учнів 8-9-тих класів 152.5 KB
  Ведучий 1. До нашої школи надійшло повідомлення від Старика Хотабича. Цей вельмишановний старець повідомляє, що на Таємничому Острові Скарбів він заховав чарівний напиток. Хто скуштує цього напитку усі задачі з математики буде мов насіння лускати. Отримає цей напиток той хто найкраще пройде математичну естафету. Для визначення переможця у нас працює рада розумних.
52913. Sport. Конспект урока по английскому языку 7 класс 65.5 KB
  One group told us about how to prepare to a football competition. Now we will listen another group with its project how to organize basketball game. Let’s start.
52914. Людина – частина Всесвіту. Етика, 6 клас 34 KB
  Визначте які риси і життєві правила притаманні людині яка живе в гармонії з природою. На великому аркуші паперу намалюйте її портрет на якому зобразіть визначені вами риси. Визначте які риси й життєві правила притаманні людині яка дбає про своє здоров’я. На великому аркуші паперу намалюйте її портрет на якому зобразіть визначені вами риси.
52915. Використання ігрового матеріалу при вивченні і засвоєнні нових термінів на уроках етики 55 KB
  Використання у педагогічній практиці ігрових моментів – це лише один з можливих шляхів отримання учнями знань з предмета реалізації своїх можливостей здобуття не тільки гарних оцінок але і задоволення від уроку гра допомагає дітям повірити в себе викликає натхнення і захоплення. Гра дає надзвичайно багаті можливості бо дозволяє кожній дитині відчути себе суб’єктом життєдіяльності виявляти і розвивати свою особистість. Але слід зазначити що гра – це не самоціль а лише один із засобів у системі формування творчої допитливості. Гра –...
52916. У чому полягає етика відносин між народами в демократичному суспільстві. Урок 106 KB
  Мета уроку: збагатити знання учнів про багатокультурну державу та поліетнічне суспільство, на практичних прикладах розкрити зміст понять «патріотизм», «шовінізм»; продовжити вчити учнів працювати з текстом, виділяти головне, находити відповіді на питання, вдосконалювати вміння висловлювати свою думку та поважати інші думки;