Разделы презентаций


Часть 2 Объектно-ориентированное программирование

Содержание

Введение. Эволюция технологии разработки ПО. Процедурная и объектная декомпозиция «Стихийное» программирование – до середины 60-х годов ХХ века – технология отсутствует – программирование – искусство создания программ – в конце

Слайды и текст этой презентации

Слайд 1Часть 2 Объектно-ориентированное программирование
МГТУ им. Н.Э. Баумана
Факультет Информатика и системы

управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф.
Иванова

Галина Сергеевна

2016

Часть 2 Объектно-ориентированное программированиеМГТУ им. Н.Э. БауманаФакультет Информатика и системы управленияКафедра Компьютерные системы и сетиЛектор: д.т.н., проф.

Слайд 2Введение. Эволюция технологии разработки ПО. Процедурная и объектная декомпозиция
«Стихийное»

программирование – до середины 60-х годов ХХ века – технология

отсутствует – программирование – искусство создания программ – в конце периода появляется возможность создания подпрограмм – используется процедурная декомпозиция.

Слабое место – большая вероятность испортить глобальные данные.

Введение. Эволюция технологии разработки ПО.  Процедурная и объектная декомпозиция «Стихийное» программирование – до середины 60-х годов

Слайд 3Эволюция технологии разработки ПО (2)
2. Структурный подход к программированию -

60-70-е годы ХХ века – технология, представляющая собой набор рекомендаций

и методов, базирующихся на большом опыте работы:
нисходящая разработка;
декомпозиция методом пошаговой детализации;
структурное программирование;
сквозной структурный контроль и т. д.
Эволюция технологии разработки ПО (2)2. Структурный подход к программированию - 60-70-е годы ХХ века – технология, представляющая

Слайд 4Эволюция технологии разработки ПО (3)
Модульное программирование – выделение групп подпрограмм,

использующих общие глобальные данные в модули – отдельно компилируемые части

программы (многоуровневая декомпозиция).

Слабое место – большое количество передаваемых параметров.

Эволюция технологии разработки ПО (3)Модульное программирование – выделение групп подпрограмм, использующих общие глобальные данные в модули –

Слайд 5Эволюция технологии разработки ПО (4)
3. Объектный подход к программированию –

с середины 80-х до наших дней.
Объектно-ориентированное программирование

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

Слайд 6Эволюция технологии разработки ПО (5)
Компонентный подход – с конца 90-х

годов ХХ века (COM-техноло-гия) – подключение объектов через универсальные интерфейсы

– развитие сетевого программирования – появление CASE-техноло-гий.
Эволюция технологии разработки ПО (5)Компонентный подход – с конца 90-х годов ХХ века (COM-техноло-гия) – подключение объектов

Слайд 7Пример
Разработать программную систему, которая для указанной функции на заданном

отрезке:
строит таблицу значений с определенным шагом;
определяет корни;
определяет максимум и минимум.



Пример Разработать программную систему, которая для указанной функции на заданном отрезке:строит таблицу значений с определенным шагом;определяет корни;определяет

Слайд 8Формы интерфейса пользователя
Программа исследования функций.
Введите функцию или слово «Конец»: y

= cos(x) – 1
Назначьте интервал: [-1, 0)
Введите номер решаемой задачи


( 1 – построение таблицы значений;
2 – нахождение корней;
3 – нахождение минимума и максимума;
4 – смена функции или завершение программы): 1

Построение таблицы.
Введите шаг: 0.01
Таблица значений:
x= y=

Нахождение корней.
Таблица корней:
x= y=

Экстремумы.
Минимум:
x= y=
Максимум:
x= y=

Формы интерфейса пользователяПрограмма исследования функций.Введите функцию или слово «Конец»: y = cos(x) – 1Назначьте интервал: [-1, 0)Введите

Слайд 9Диаграмма состояний интерфейса пользователя
Ввод
функции
Меню
Таблица
Корни
Экстремумы
1
2
3
4
«Конец»

Диаграмма состояний интерфейса пользователяВводфункцииМенюТаблицаКорниЭкстремумы1234«Конец»

Слайд 10Разработка схем алгоритмов методом пошаговой детализации
Начало
F, a, b
F =“End”
Analyze
(fun,a,b)
да
нет
Конец
F,

a, b
Analyze(F..)
Cod
Cod = 4
Roots
(fun,a,b)
да
нет
Выход
Cod
Cod
2
1
3
Table
(fun,a,b)
Extremes
(fun,a,b)
Translate
(F,fun)

Разработка схем алгоритмов методом пошаговой детализацииНачалоF, a, bF =“End”Analyze (fun,a,b)данетКонецF, a, bAnalyze(F..)CodCod = 4Roots(fun,a,b)данетВыходCodCod213Table (fun,a,b)Extremes(fun,a,b)Translate (F,fun)

Слайд 11Схема структурная программы
Main Program
Translate
Analyze
Roots
Extremes
Table
Процедурная декомпозиция – процесс разбиения программы на

подпрограммы.
Структурной называют декомпозицию, если:
каждая подпрограмма имеет один вход и

один выход;
подпрограммы нижних уровней не вызывают подпрограмм верхних уровней;
размер подпрограммы не превышает 40-50 операторов;
в алгоритме использованы только структурные конструкции.
Схема структурная программыMain ProgramTranslateAnalyzeRootsExtremesTableПроцедурная декомпозиция – процесс разбиения программы на подпрограммы.Структурной называют декомпозицию, если: каждая подпрограмма имеет

Слайд 12Объектная декомпозиция
Объектная декомпозиция – процесс представления предметной области задачи в

виде отдельных функциональных элементов (объектов предметной области), обменивающихся в процессе

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

Ввод
функции

Активизировать

Активизировать

Меню

Таблица

Корни

Экстремумы

Активизировать

Активизировать

Активизировать

Функция

Задать

Рассчитать

Рассчитать

Рассчитать

Объект предметной области характеризуется:
именем;
состоянием;
поведением.
Состояние – совокупность значений характеристик объекта, существенных с т. з. решаемой задачи.
Поведение – совокупность реакций на сообщения.

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

Слайд 13Реализация объектов предметной области
Класс – это структурный тип данных, который

включает описание полей данных, а также процедур и функций, работающих

с этими полями данных.
Применительно к классам такие процедуры и функции получили название методов.
Объект-переменная – переменная типа «класс».
Реализация объектов предметной областиКласс – это структурный тип данных, который включает описание полей данных, а также процедур

Слайд 14Методы построения классов
Наследование – механизм, позволяющий строить класс на базе

более простого посредством добавления полей и определения новых методов.
При

этом исходный класс, на базе которого выполняется построение, называют родительским или базовым, а строящейся класс – потомком или производным классом.
Если при наследовании какие-либо методы переопределяются, то такое наследование называется полиморфным.

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

3. Наполнение – механизм, позволяющих
включать указатели на объекты других
классов в конструируемый.
Методы построения классовНаследование – механизм, позволяющий строить класс на базе более простого посредством добавления полей и определения

Слайд 15Глава 7 Средства объектно-ориентированного программирования
МГТУ им. Н.Э. Баумана
Факультет Информатика и

системы управления
Кафедра Компьютерные системы и сети
Лектор: д.т.н., проф.

Иванова Галина Сергеевна

2014

Глава 7 Средства объектно-ориентированного программированияМГТУ им. Н.Э. БауманаФакультет Информатика и системы управленияКафедра Компьютерные системы и сетиЛектор: д.т.н.,

Слайд 167.1 Определение класса, объявление объектов и инициализация полей
C точки

зрения синтаксиса класс – структурный тип данных, в котором помимо

полей разрешается описывать прототипы (заголовки) процедур и функций, работающих с этими полями данных.




Type TRoom = object
length, width:single;
function Square: single; {прототип функции}
end;
Function TRoom.Square;
Begin
Result:= length*width;
End;

Поскольку данные и методы инкапсулированы в пределах класса, все поля автоматически доступны из любого метода

7.1 Определение класса, объявление объектов и инициализация полей C точки зрения синтаксиса класс – структурный тип данных,

Слайд 17Неявный параметр Self
Любой метод неявно получает параметр Self – ссылку

(адрес) на поля объекта, и обращение к полям происходит через

это имя.

Function TRoom.Square;
Begin
Result:= Self.length* Self.width;
End;

При необходимости эту ссылку можно указывать явно:

@Self – адрес области полей данных объекта.
Неявный параметр SelfЛюбой метод неявно получает параметр Self – ссылку (адрес) на поля объекта, и обращение к

Слайд 18Объявление объектов класса
Примеры:

Var A:TRoom; {объект А класса TRoom}
B:array[1..5]

of TRoom; {массив объектов типа TRoom}
Type pTRoom=^TRoom; {тип указателя

на объекты класса TRoom}
Var pC: pTRoom; {указатель на объекта класса TRoom}

Для динамического объекта необходимо выделить память:
New(pC);
а после его использования – освободить память:
Dispose(pC);

Обращение к полям и методам аналогично доступу к полям записей:
Примеры:
а) v:=A.length;
б) s:= A.Square;
в) s:=s+B[i].Square;
г) pC^.length:=3;
Объявление объектов классаПримеры:Var A:TRoom;  {объект А класса TRoom}	 B:array[1..5] of TRoom;  {массив объектов типа TRoom}Type

Слайд 19Инициализация полей прямой записью в поле
Program Ex_7_01a;
{$APPTYPE CONSOLE}
Uses SysUtils;
Type

TRoom = object

length, width:single;
function Square:single;
end;
Function TRoom.Square;
Begin
Result:= length* width;
End;
Var A:TRoom;
Begin
A.length:=3.5;
A.width:=5.1;
WriteLn('S = ',A.Square:8:3);
ReadLn;
End.
Инициализация полей прямой записью в поле Program Ex_7_01a;{$APPTYPE CONSOLE}Uses SysUtils;Type TRoom = object

Слайд 20Инициализация при объявлении объекта
Program Ex_07_01b;
{$APPTYPE CONSOLE}
Uses SysUtils;
Type TRoom = object

length, width:single;

function Square:single;
end;
Function TRoom.Square;
Begin
Result:= length* width;
End;
Var A:TRoom = (length:3.5; width:5.1);
Begin
WriteLn('S= ',A.Square:8:3);
ReadLn;
End.
Инициализация при объявлении объектаProgram Ex_07_01b;{$APPTYPE CONSOLE}Uses SysUtils;Type TRoom = object

Слайд 21Инициализация посредством метода
Program Ex_07_01c;
{$APPTYPE CONSOLE}
Uses SysUtils;
Type TRoom = object

length, width:single;

function Square:single;
procedure Init(l,w:single);
end;
Function TRoom.Square;
Begin Square:= length*width; End;
Procedure TRoom.Init;
Begin length:=l; width:=w; End;
Var A:TRoom;
Begin
A.Init(3.5,5.1);
WriteLn('S= ',A.Square:8:3);
ReadLn;
End.
Инициализация посредством методаProgram Ex_07_01c;{$APPTYPE CONSOLE}Uses SysUtils;Type TRoom = object        length,

Слайд 22Операция присваивания объектов
Над объектами одного класса определена операция присваивания.

Физически при этом происходит копирование полей одного объекта в другой

методом «поле за полем»:
Пример:

Var A:TRoom =(length:3.7; width:5.2);
Var B:TRoom;
...
B:=A;
Операция присваивания объектов Над объектами одного класса определена операция присваивания. Физически при этом происходит копирование полей одного

Слайд 237.2 Ограничение доступа к полям и методам
Ограничение только в

пределах модуля!
Unit Room;
Interface
Type TRoom = object

private length, width: single;
public function Square: single;
procedure Init(l,w: single);
end;
Implementation
Function TRoom.Square;
Begin Result:= length* width; End;
Procedure TRoom.Init;
Begin length:=l; width:=w; End;
End.
7.2 Ограничение доступа к полям и методам Ограничение только в пределах модуля!Unit Room;Interface	Type TRoom = object

Слайд 24Ограничение доступа (2)
Program Ex_7_02;
{$APPTYPE CONSOLE}
Uses SysUtils,
Room in

'Room.pas';
Var A:TRoom;
Begin
A.Init(3.5,5.1);
WriteLn('Room: length = ', A.length:6:2,

'; width =', A.width:6:2);
WriteLn('Square =',A.Square:8:2);
ReadLn;
End.
Ограничение доступа (2)Program Ex_7_02;{$APPTYPE CONSOLE}Uses SysUtils,   Room in 'Room.pas';Var A:TRoom;Begin  A.Init(3.5,5.1);  WriteLn('Room: length

Слайд 257.3 Наследование
Наследование - конструирование новых более сложных производных классов из

уже имеющихся базовых посредством добавления полей и методов.




Program Ex_07_03;
{$APPTYPE

CONSOLE}
Uses SysUtils,
Room in 'Ex_08_02\Room.pas';
Type TVRoom = object(TRoom)
height:single;
function V:single;
procedure NewInit(l,w,h:single);
end;
7.3 НаследованиеНаследование - конструирование новых более сложных производных классов из уже имеющихся базовых посредством добавления полей и

Слайд 26Наследование (2)
Procedure TVRoom.NewInit;
Begin
Init(l,w);

height:=h;
End;
Function TVRoom.V;
Begin
Result:=Square*height;
End;

Var A:TVRoom;
Begin
A.NewInit(3.4,5.1,2.8);
WriteLn('Square = ', A.Square:6:2);
WriteLn('V = ', A.V:6:2);
ReadLn;
End.

Поля TVRoom

Наследование (2)Procedure TVRoom.NewInit; Begin    Init(l,w);    height:=h; End;Function TVRoom.V; Begin

Слайд 27Присваивание объектов иерархии
Допустимо присваивать переменной типа базового класса значение переменной

типа объекта производного класса.

Var A:TRoom;
B:TVRoom;
...
A:=B; {допустимо}
B:=A; {

не допустимо!}
Присваивание объектов иерархииДопустимо присваивать переменной типа базового класса значение переменной типа объекта производного класса. Var A:TRoom;	 B:TVRoom;...A:=B;

Слайд 28Присваивание указателей в иерархии
Допустимо указателю на объект базового класса присваивать

адреса объекта производного класса.
Однако при этом возникает проблема «невидимых»

полей.







Var pC:^TRoom;
E:TVRoom;
...
pC:= @E;
pC^.length:=3.1;
pC^.height:=2.7; {ошибка!}

Type pTVRoom=^TVRoom;
Var pC: ^TRoom;
E:TVRoom;
...
pC:= @E;
pTVRoom(pC)^.height:=2.7;

Присваивание указателей в иерархииДопустимо указателю на объект базового класса присваивать адреса объекта производного класса. Однако при этом

Слайд 297.4 Композиция
Композиция – включение объектов одного класса в другой. Реализуется

механизмом поддержки объектных полей.



Program Ex_7_04;
{$APPTYPE CONSOLE}
Uses SysUtils,
Room

in 'Ex_08_02\Room.pas';
Type TFlat=object
n:byte;
rooms:array[1..15] of TRoom;
function FlatSquare:single;
procedure Init(an:byte;
Const ar:array of TRoom);
end;
7.4 КомпозицияКомпозиция – включение объектов одного класса в другой. Реализуется механизмом поддержки объектных полей.Program Ex_7_04;{$APPTYPE CONSOLE}Uses SysUtils,

Слайд 30Композиция (2)
Procedure TFlat.Init;
Var i:byte;
Begin
n:=an;
for i:=1

to n do
rooms[i].Init(ar[i-1].length, ar[i-1].width);
End;
Function TFlat.FlatSquare;
Var S:single;

i:integer;
Begin
S:=0;
for i:=1 to n do S:=S+rooms[i].Square;
Result:=S;
End;
Var mas:array[1..3] of TRoom=
((length:2.5; width:3.75),
(length:2.85; width:4.1),
(length:2.3; width:2.8));

Композиция (2)Procedure TFlat.Init;Var i:byte;Begin  n:=an;  for i:=1 to n do    rooms[i].Init(ar[i-1].length, ar[i-1].width);End;Function

Слайд 31Композиция (3)
Var F:TFlat;
Begin
F.Init(3,mas);

WriteLn('S flat =',F.FlatSquare);
ReadLn;
End.

Композиция (3)Var F:TFlat;Begin    F.Init(3,mas);    WriteLn('S flat =',F.FlatSquare);    ReadLn;End.

Слайд 327.5 Наполнение (агрегация)
Наполнение – способ конструирования классов, при котором в

строящийся класс включают неопределенное количество: от 0 до сравнительно больших

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



Program Ex_7_05;
{$APPTYPE CONSOLE}
Uses SysUtils,
Room in 'Ex_08_02\Room.pas';
Type TBRoom = object(TRoom)
pB: ^TRoom;
function BSquare:single;
procedure InitAll(l,w:single; lb,wb:single);
end;

Наполнение

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

7.5 Наполнение (агрегация)Наполнение – способ конструирования классов, при котором в строящийся класс включают неопределенное количество: от 0

Слайд 33Наполнение (2)
Procedure TBRoom. InitAll;
Begin
Init(l,w);

if (lb=0)or(wb=0) then pB:=nil
else

begin
New(pB); pB^.Init(lb,wb);
end;
End;
Function TBRoom.BSquare;
Begin
if pB=nil then Result:= Square
else Result:= Square+pB^.Square;
End;
Var B:TBRoom;
Begin
B.InitAll(3.4,5.1,1.8,0.8);
WriteLn('BSquare =',B.BSquare:8:2);
ReadLn;
End.
Наполнение (2)Procedure TBRoom. InitAll; Begin    Init(l,w);    if (lb=0)or(wb=0) then pB:=nil

Слайд 347.6 Простой полиморфизм
Простой полиморфизм – механизм переопределения методов при наследовании,

при котором связь метода с объектом выполняется на этапе компиляции

(раннее связывание).




Program Ex_7_06;
{$APPTYPE CONSOLE}
Uses SysUtils,
Room in 'Ex_08_02\Room.pas';
Type TVRoom2 = object(TRoom)
height:single;
function Square:single;
procedure Init(l,w,h:single);
end;
7.6 Простой полиморфизмПростой полиморфизм – механизм переопределения методов при наследовании, при котором связь метода с объектом выполняется

Слайд 35Простой полиморфизм (2)
Procedure TVRoom2.Init;
Begin
inherited Init(l,w);

{ TRoom.Init(l,w);}
height:=h;
End;
Function TVRoom2.Square;
Begin

Result:=2*(inherited Square+height*
(length+width));
End;
Var A:TVRoom2;
Begin
A.Init(3.4,5.1,2.8);
WriteLn('Square = ',A.Square:6:2);
ReadLn;
End.
Простой полиморфизм (2)Procedure TVRoom2.Init; Begin    inherited Init(l,w);  { TRoom.Init(l,w);}    height:=h;

Слайд 36Обращение объекта производного класса к переопределенному методу базового класса в

программе
При необходимости обращении к переопределенному методу базового класса явно меняют

тип переменной – объекта класса, например так

Var A:TVRoom2;
B:TRoom;
...
B:=A;
B.Square;
Обращение объекта производного класса к переопределенному методу базового класса  в программеПри необходимости обращении к переопределенному методу

Слайд 377.7 Сложный полиморфизм. Конструкторы
Program Ex_7_07;
{$APPTYPE CONSOLE}
Uses SysUtils;
Type TRoomP=object

length, width:single;

function Square:single;
procedure Print;
procedure Init(l,w:single);
end;

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

7.7 Сложный полиморфизм. КонструкторыProgram Ex_7_07;{$APPTYPE CONSOLE}Uses SysUtils;Type TRoomP=object        length, width:single;

Слайд 38Сложный полиморфизм (2)
Function TRoomP.Square;
Begin Result:= length* width; End;
Procedure

TRoomP.Print;
Begin WriteLn('Square =', Square:6:2); End;
Procedure TRoomP.Init;
Begin

length:=l; width:=w; End;
Type TVRoomP = object(TRoomP)
height:single;
function Square:single;
procedure Init(l,w,h:single);
end;
Procedure TVRoomP.Init;
Begin
inherited Init(l,w);
height:=h;
End;
Сложный полиморфизм (2)Function TRoomP.Square;  Begin Result:= length* width; End;Procedure TRoomP.Print;  Begin WriteLn('Square =', Square:6:2); End;Procedure

Слайд 39Сложный полиморфизм (2)
Function TVRoomP.Square;
Begin
Square:=2*(inherited Square+height*(length+width));

End;
Var A:TRoomP; B:TVRoomP;
Begin
A.Init(3.5,5.1);
A.Print;
B.Init(3.5,5.1,2.7);

B.Print;
ReadLn;
End.

Square = 17.85
Square = 17.85

Ошибка!

Сложный полиморфизм (2)Function TVRoomP.Square; Begin  Square:=2*(inherited Square+height*(length+width));   End;Var A:TRoomP; B:TVRoomP;Begin  A.Init(3.5,5.1);  A.Print;

Слайд 40Пояснение к ошибке
При позднем связывании нужный аспект полиморфного метода

определяется на этапе выполнения программы по типу объекта, для которого

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

Слайд 41Реализация сложного полиморфизма
Для организации сложного полиморфизма необходимо:
1) переопределяемые методы описать

служебным словом virtual;
2) к методам класса с виртуальными полиморфными

методами добавить специальный метод-процедуру – конструктор, в котором служебное слово procedure заменено служебным словом constructor;
3) вызвать конструктор прежде, чем произойдет первое обращение к виртуальным полиморфным методам.
Подключение осуществляется с исполь-
зованием таблицы вир-
туальных методов
(ТВМ), которая создается при выполнении конструк- тора.
Реализация сложного полиморфизмаДля организации сложного полиморфизма необходимо:1) переопределяемые методы описать служебным словом virtual; 2) к методам класса

Слайд 42Различие раннего и позднего связывания

Раннее связывание – адрес метода

определяется на этапе компиляции по объявленному типу переменной.
Позднее связывание –

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

Слайд 43Исправленный пример
Unit RoomP;
interface
Type TRoomP=object

length, width:single;
function Square:single;

virtual;
procedure Print;
constructor Init(l,w:single);
end;
Type TVRoomP = object(TRoomP)
height:single;
function Square:single; virtual;
constructor Init(l,w,h:single);
end;
Исправленный примерUnit RoomP;interfaceType TRoomP=object       length, width:single;

Слайд 44Исправленный пример (2)
implementation
Function TRoomP.Square;
Begin Result:= length* width; End;
Procedure

TRoomP.Print;
Begin WriteLn('Square =', Square:6:2); End;
Constructor TRoomP.Init;
Begin

length:=l; width:=w; End;

Constructor TVRoomP.Init;
Begin
inherited Init(l,w);
height:=h;
End;
Function TVRoomP.Square;
Begin
Square:=2*(inherited Square+height*(length+ width));
End;
end.
Исправленный пример (2)implementationFunction TRoomP.Square;  Begin Result:= length* width; End;Procedure TRoomP.Print;  Begin WriteLn('Square =', Square:6:2); End;Constructor

Слайд 45Исправленный пример (3)
Program Ex_7_07a;
{$APPTYPE CONSOLE}
Uses SysUtils,
RoomP in

'RoomP.pas';
Var A:TRoomP; B:TVRoomP;
Begin
A.Init(3.5,5.1);
A.Print;
B.Init(3.5,5.1,2.7);

B.Print;
ReadLn;
End.

Square = 17.85
Square = 82.14

Исправленный пример (3)Program Ex_7_07a;{$APPTYPE CONSOLE}Uses SysUtils,   RoomP in 'RoomP.pas';Var A:TRoomP; B:TVRoomP;Begin  A.Init(3.5,5.1);  A.Print;

Слайд 463 случая обязательного использования сложного полиморфизма
1-й случай – если наследуемый

метод для объекта производного класса вызывает метод, переопределенный в производном

классе.

2-й случай – если объект производного класса через указатель базового класса обращается к методу, переопределенному производным классом.

3-й случай – если процедура вызывает переопределенный метод для объекта производного класса, переданного в процедуру через параметр-переменную, описанный как объект базового класса («процедура с полиморфным объектом»).
3 случая обязательного использования сложного полиморфизма1-й случай – если наследуемый метод для объекта производного класса вызывает метод,

Слайд 472-й случай
Program Ex_7_07b;
{$APPTYPE CONSOLE}
Uses SysUtils,
RoomP in 'Ex_07_07\RoomP.pas';

Var

pA: ^TRoomP; B:TVRoomP;
Begin
B.Init(3.5,5.1,2.7);
WriteLn('Square =', B.Square:6:2);

pA:=@B;
WriteLn('Square =', pA^.Square:6:2);
ReadLn;
end.

Square = 17.85
Square = 82.14

2-й случайProgram Ex_7_07b;{$APPTYPE CONSOLE}Uses SysUtils,   RoomP in 'Ex_07_07\RoomP.pas';Var pA: ^TRoomP; B:TVRoomP;Begin  B.Init(3.5,5.1,2.7);  WriteLn('Square

Слайд 483-й случай
Program Ex_7_07c;
{$APPTYPE CONSOLE}
Uses SysUtils,
RoomP in 'Ex_08_07\RoomP.pas';
Procedure

Print(Var R:TRoomP);
Begin
WriteLn('Square =', R.Square:6:2);
End;
Var A:TRoomP;

B:TVRoomP;
Begin
A.Init(3.5,5.1);
B.Init(3.5,5.1,2.7);
Print(A);
Print(B);
ReadLn;
End.

Square = 17.85
Square = 82.14

3-й случайProgram Ex_7_07c;{$APPTYPE CONSOLE}Uses SysUtils,   RoomP in 'Ex_08_07\RoomP.pas';Procedure Print(Var R:TRoomP); Begin   WriteLn('Square =',

Слайд 49Функция определения типа полиморфного объекта
TypeOf():pointer – возвращает

адрес ТВМ класса. Если адрес ТВМ объекта и класса совпадают,

то объект является переменной данного класса.

Пример:
if TypeOf(Self) = TypeOf(<Имя класса>)
then <Объект принадлежит классу>
else <Объект не принадлежит классу>
Функция определения типа полиморфного объектаTypeOf():pointer – возвращает адрес ТВМ класса. Если адрес ТВМ объекта и класса совпадают,

Слайд 50Свойства виртуальных методов класса
позднее связывание требует построения ТВМ, а следовательно

больше памяти;

2) вызов виртуальных полиморфных методов происходит через ТВМ, а

следовательно медленнее;

3) список параметров одноименных виртуальных полиморфных методов должен совпадать, а статических полиморфных – не обязательно;

4) статический полиморфный метод не может переопределить виртуальный полиморфный метод.
Свойства виртуальных методов классапозднее связывание требует построения ТВМ, а следовательно больше памяти;2) вызов виртуальных полиморфных методов происходит

Слайд 517.8 Динамические полиморфные объекты. Деструкторы
Создание полиморфных объектов:

Функция New() –

возвращает адрес размещенного и, возможно, сконструированного объекта.
После необходим вызов

конструктора.

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

Уничтожение полиморфных объектов:

Процедура Dispose(<Указатель>) – перед вызовом процедуры необходим вызов деструктора, если он указан, и затем –выполняется освобождение памяти.
7.8 Динамические полиморфные объекты. ДеструкторыСоздание полиморфных объектов:Функция New() – возвращает адрес размещенного и, возможно, сконструированного объекта. 	После

Слайд 52Динамические полиморфные объекты (2)
Program Ex_7_08;
{$APPTYPE CONSOLE}
Uses SysUtils;
Type pTRoomD = ^TRoomD;

TRoomD = object

length, width:single;
function Square:single; virtual;
constructor Init(l,w:single);
destructor Done;
end;
Type pTVRoomD = ^TVRoomD;
TVRoomD = object(TRoomD)
height:single;
function Square:single; virtual;
constructor Init(l,w,h:single);
end;
Динамические полиморфные объекты (2)Program Ex_7_08;{$APPTYPE CONSOLE}Uses SysUtils;Type pTRoomD = ^TRoomD;   TRoomD = object

Слайд 53Динамические полиморфные объекты (3)
Function TRoomD.Square;
Begin Result:= length* width;

End;
Constructor TRoomD.Init;
Begin length:=l; width:=w; End;
Destructor TRoomD.Done;
Begin

End;
Constructor TVRoomD.Init;
Begin
inherited Init(l,w);
height:=h;
End;
Function TVRoomD.Square;
Begin
Result:=2*(inherited Square+height*(length+ width));
End;
Динамические полиморфные объекты (3)Function TRoomD.Square;  Begin Result:= length* width; End;Constructor TRoomD.Init;  Begin length:=l; width:=w; End;Destructor

Слайд 54Динамические полиморфные объекты (4)
Var pA: pTRoomD; pB:pTVRoomD;
Begin
{указатель базового типа,

объект базового типа}
pA:=New(pTRoomD,Init(3.5,5.1));
WriteLn('Square =', pA^.Square:6:2);
Dispose(pA,Done);

{указатель производного типа, объект производного типа}
pB:=New(pTVRoomD,Init(3.5,5.1,2.7));
WriteLn('Square =', pB^.Square:6:2);
Dispose(pB,Done);
{указатель базового типа, объект производного типа}
pA:=New(pTVRoomD,Init(3.5,5.1,2.7));
WriteLn('Square =', pA^.Square:6:2);
Dispose(pA,Done);
ReadLn;
End.

Square = 17.85
Square = 82.14
Square = 82.14

Динамические полиморфные объекты (4)Var pA: pTRoomD; pB:pTVRoomD;Begin {указатель базового типа, объект базового типа}	 pA:=New(pTRoomD,Init(3.5,5.1));  WriteLn('Square =',

Слайд 55Динамические поля в объектах
Program Ex_7_09;
{$APPTYPE CONSOLE}
Uses SysUtils;
Type pTRoomD=^TRoomD;

TRoomD=object
length,

width:single;
function Square:single; virtual;
constructor Init(l,w:single);
destructor Done; virtual;
end;
Type pTBRoomD=^TBRoomD;
TBRoomD=object(TRoomD)
pB:pTRoomD;
function Square:single; virtual;
function BSquare:single;
constructor Init(l,w:single;
lb,wb:single);
destructor Done; virtual;
end;
Динамические поля в объектах Program Ex_7_09;{$APPTYPE CONSOLE}Uses SysUtils;Type pTRoomD=^TRoomD;   TRoomD=object

Слайд 56Динамические поля в объектах (2)
Function TRoomD.Square;
Begin Square:= length*

width; End;
Constructor TRoomD.Init;
Begin length:=l; width:=w; End;
Destructor TRoomD.Done;
Begin

End;
Constructor TBRoomD.Init;
Begin inherited Init(l,w);
if (lb=0)or(wb=0) then pB:=nil
else pB:= New(pTRoomD,Init(lb,wb));
End;
Function TBRoomD.BSquare;
Begin if pB<>nil then BSquare:=pB^.Square
else BSquare:=0;
End;
Function TBRoomD. Square;
Begin Square:= inherited Square+BSquare; End;
Destructor TBRoomD.Done;
Begin if pB<>nil then Dispose(pB,Done); End;
Динамические поля в объектах (2)Function TRoomD.Square;  Begin Square:= length* width; End;Constructor TRoomD.Init;  Begin length:=l; width:=w;

Слайд 57Динамические поля в объектах (3)
Var A:TBRoomD; pB1:pTBRoomD; pB2:pTRoomD;
Begin
{статический объект

с динамическим полем}
A.Init(3.2,5.1,2.5,1);
WriteLn(A.Square:6:2,A.BSquare:6:2);
A.Done;
{динамический полиморфный объект с

динамическим полем}
pB1:=New(pTBRoomD,Init(3.2,5.1,2.5,1));
WriteLn(pB1^.Square:6:2,pB1^.BSquare:6:2);
Dispose(pB1,Done);
{динамический полиморфный объект с динамическим полем}
pB2:=new(pTBRoomD,Init(3.2,5.1,2.5,1));
WriteLn(pB2^.Square:6:2,pTBRoomD(pB2)^.BSquare:6:2);
Dispose(pB2,Done);
ReadLn;
End.

18.82 2.50
18.82 2.50
18.82 2.50

Динамические поля в объектах (3)Var A:TBRoomD; pB1:pTBRoomD; pB2:pTRoomD;Begin {статический объект с динамическим полем} A.Init(3.2,5.1,2.5,1); WriteLn(A.Square:6:2,A.BSquare:6:2); A.Done; {динамический

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика