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


 

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

29587. Принципы отбора медианосителей и оценка их эффективности 13.6 KB
  Рейтинг телевизионного времени доля в тех телезрителей которые смотрели конкретный канал в определенное время от потенциального числа телезрителей. Максимально высокий рейтинг имеет пиковое телевизионное время праймтайм. Сумма всех рейтингов целевой рейтинг показатель чистого полезного охвата умноженный на частоту контакта. Стоимость одного общерейтингового пункта мера определяющая эффективность конкретной программы.
29588. Эффективность рекламных кампаний и лояльность потребителей. Экономические и коммуникативные показатели эффективности 16.05 KB
  Наиболее популярный способ выявления эффективности рекламы методика облегчения вспоминания используемая для того чтобы определить в какой мере человек способен вспомнить ее содержание. Но даже если человек и хорошо запомнил содержание рекламы это вовсе не означает что он готов купить то что рекламируют. Второй способ выявления эффективности рекламы методика узнавания. Людям которые прочитали журнал или видели телевизионную программу предъявляют копии рекламы и задают вопросы о ней.
29589. Новые технологии и виды услуг рекламного рынка 15.87 KB
  Относительно низкая стоимость проекта. Небольшие временные затраты в разработке проекта. Краткосрочность эффекта от реализации проекта Маркетинг слухов Преимущества: 1. Невысокая стоимость в организации проекта.
29590. Соотношение охвата и частоты в медиапланировании. Использование ПО в медиапланировании 20.38 KB
  Соотношение охвата и частоты в медиапланировании. Охват это численность представителей ЦА в рамках компании имевших контакт с рекламой хотя бы 1 раз. При вычислении охвата получатели сообщения учитываются лишь один раз независимо от числа прочитанных ими газет просмотренных или прослушанных телерадиопрограмм. Охват аудитории может быть представлен и как характеристика аудитории которая видела слышала рекламу определенное число раз и как характеристика аудитории которая видела слышала рекламу не менее определенного числа раз.
29591. Рекламные агентства: виды, функции, тенденции развития 12.03 KB
  Агентство также приобретает или привлекает субподрядчиков для покупки рекламного места и времени в различных средствах массовой информации. Фирмы по приобретению рекламного времени. В услуги входит подробный анализ закупаемого времени. После реализации сформированного пакета рекламного времени такая фирма выдает график рекламной трансляции контроль его исполнения и даже проводит расчеты со СМИ.
29592. Место медиапланирования в структуре маркетинговой стратегии. Бюджет рекламной кампании 28.56 KB
  Медиапланирование: Медиапланирование это выбор оптимальных каналов размещения рекламы рекламных контактов проводимый с целью достижения максимальной эффективности рекламной кампании. Медиапланирование важный маркетинговый инструмент управления эффективностью рекламы. Он анализирует представленный товар или услугу его целевую аудиторию бюджет срок размещения рекламы а также цели которые необходимо достигнуть. Таким образом исходя из информации содержащейся в брифе и будет вестись вся последующая работа выбор рекламоносителей...
29593. Понятие индекса в медиапланировании. Расчет индекса 12.65 KB
  Понятие индекса в медиапланировании. Расчет индекса. экономический словарь ИНДЕКС от лат. Индекс исчисляется по отношению к базовому индексу базовой величине соответствующей определенному году принятому в качестве точки отсчета.
29594. Критерии характеристики медианосителя 19.63 KB
  Селективность аудитории избирательность ЦА udience selectivity – свойство медианосителя доводить информацию до определенного сегмента потребителей при минимальном охвате незаданного сегмента потребителейт. Потенциал охвата rech potentil – способность медианосителя собрать аккумулировать максимальное количество людей в качестве своей аудитории. Скорость аккумулирования аудитории speed of udience ccumultion – показатель количества выходов или количества времени необходимых медианосителю для того чтобы охватить всю свою...
29595. Медиапланирование 12.03 KB
  Медианоситель – конкретный представитель медиаканала где размещается рекламное сообщение. Медианоситель отбирается по качественным и количественным показателям. Медиамикс – размещение рекламных материалов сразу в нескольких СМИ и как правило под типовым набором смеси из СМИ медиамикс понимается комбинация ТВ Радио Пресса Наружка. Долю охваченной и неохваченной аудитории при медиамиксе вычисляем формулам теории вероятности: 1Pb = 1P 1Pb где Pb охваченная медиамиксом аудитория P – аудитория охваченная первым медиа Pb...