Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 12 лет назад пользователемwww.StGAU.ru
1 Глава 11. ОБЪЕКТЫ Описание классов, создание объектов Ограничение доступа к полям и методам Создание библиотек классов Реализация принципа наследования Полиморфизм Раннее связывание Позднее связывание, виртуальные методы
2 2 Гл. 11. ОБЪЕКТЫ Класс – это структурный тип данных, который включает описание полей данных, а также процедур и функций (методы), работающих с этими полями. Type PMouse = ^TMouse; TMouse = object Visible : Boolean; {признак включен/выключен} Keys : Byte; {количество кнопок} сonstructor Init; {конструктор} destructor Done; {деструктор} procedure On; {включить указатель мыши} procedure Off; {выключить указатель мыши} end; Метод Init реализует операцию создания и инициализации объекта – это так называемый конструктор, описание которого начинается с зарезервированного слова constructor. Любой класс должен иметь как минимум один конструктор. Обратным конструктору является метод уничтожения объекта Done – деструктор. Для этого используется зарезервированное слово destructor. Класс не может иметь более одного деструктора. Если объект динамический, то конструктор выделяет память для него в куче, а деструктор – освобождает память.
3 3 Гл. 11. ОБЪЕКТЫ Объект – это экземпляр класса, иначе переменная типа object. Подобно записи, объект используется с префиксной частью в виде имени этого объекта. Статический объект: Var Mouse : TMouse; Begin Mouse.Init;{инициализация объекта} Mouse.On;{включить указатель мыши}... End. Динамический объект: Var Mouse : PMouse; {тип – указатель на TMouse} Begin New(Mouse,Init);{инициализация объекта} Mouse^.On;{включить указатель мыши}... Mouse^.Off;{включить указатель мыши} Dispose(Mouse,Done);{уничтожить объект} End.
4 4 Гл. 11. ОБЪЕКТЫ if Mouse^.Keys > 0 then begin Mouse^.On;... Mouse^.Off; end; Ограничение доступа к полям и методам Фрагмент ошибочен с точки зрения объектного подхода, поскольку нарушен принцип инкапсуляции. Получать информацию об объекте следует только при помощи операции селектора, т.е. специальным методом-операцией.
5 5 Гл. 11. ОБЪЕКТЫ Type PMouse = ^TMouse; TMouse = object constructor Init; destructor Done; procedure On; procedure Off; function GetKeys : Byte; {число кнопок у мыши} function IsVisible : Boolean; {видна мышь или нет} private Visible : Boolean; Keys : Byte; end; Введены два метода-селектора GetKeys, IsVisible для определения состояния объекта. Сами поля Visible и Keys убраны в специальную частную секцию private. Эта секция делает недоступными для непосредственного использования в программе поля и методы, расположенные в ней.
6 6 Гл. 11. ОБЪЕКТЫ Unit UMouse; Interface{секция интерфейса} Type PMouse = ^TMouse; TMouse = object constructor Init; destructor Done; procedure On; procedure Off; function GetKeys : Byte; function IsVisible : Boolean; private Visible : Boolean; Keys : Byte; end; При создании библиотек классов они описываются в отдельных модулях, которые могут подключаться к основной программе для использования этих классов. Для соблюдения принципа инкапсуляции, класс описывают в разделе Interface, а его методы – в разделе Implementation, что позволяет «скрыть» внутреннее содержание методов.
7 7 Гл. 11. ОБЪЕКТЫ Implementation{секция реализации} constructor TMouse.Init; begin... end;... function TMouse.IsVisible : Boolean; begin... end; Begin{секция инициализации}... End. Program Example; Uses UMouse; Var Mouse : PMouse; Begin... End.
8 8 Гл. 11. ОБЪЕКТЫ Program NewMouseDemo; Uses UMouse; {подключаем созданный ранее модуль} Type PNewMouse = ^TNewMouse; TNewMouse = object(TMouse); {предок - TMouse} function GetClick(Var X,Y : Word) : Byte; end; Var Mouse : PNewMouse; A,B : Word; Button : Byte; Function TNewMouse.GetClick(Var X,Y : Word): Byte; begin {функция возвращает номер нажатой... кнопки в своем значении и текущие координаты мыши в параметрах- end; переменных} Наследование При наследовании объекты класса-потомка получают возможность использования ("наследуют") поля и методы класса-родителя, что позволяет повторно не определять этих компонентов класса.
9 9 Гл. 11. ОБЪЕКТЫ Begin New(Mouse,Init); if Mouse^.GetKeys > 0 then begin {проверка, подключена ли мышь} Mouse^.On; repeat Button:=Mouse^.GetClick(A,B); if Button > 0 then Writeln(Button,A,B); until Button = 3; Mouse^.Off; end; Dispose(Mouse,Done); End. Новый класс TMouseNew унаследовал все свойства класса TMouse, т.к. является его потомком (object(TMouse)). Соответственно, класс TMouse для класса TMouseNew является предком, или родителем. В новом классе описан только один новый метод GetClick для получения информации о нажатой кнопке. При этом все методы класса TMouse становятся доступными для экземпляров класса TMouseNew.
10 10 Гл. 11. ОБЪЕКТЫ Type PPoint = ^TPoint; {объект – точка на экране} TPoint = object X, Y : Word; Color : Byte; constructor Init (InitX, InitY : Word; InitColor : Byte); destructor Done; procedure Draw; end; PCircle = ^TCircle ; {объект - окружность на экране} TCircle = object(TPoint); {производный от TPoint} Radius : Word; constructor Init (InitX,InitY,InitRadius:Word; InitColor : Byte); procedure Draw; end; Полиморфизм В объектно-ориентированном программировании полиморфизм проявляется в возможности переопределять методы класса-родителя, т.е. расширения свойств объекта путем «перестраивания» его методов.
11 11 Гл. 11. ОБЪЕКТЫ Сonstructor TPoint.Init; {при создании объекта begin задаются координаты точки и X := InitX; ее цвет через параметры Y := InitY; конструктора} Color := InitColor; end; Destructor TPoint.Done; {нет операторов, объект begin end; уничтожается с помощью Dispose} Рrocedure TPoint.Draw; begin SetColor(Color); {процедуры из модуля Graph} PutPixel(X,Y); end; Сonstructor TCircle.Init; begin Radius := InitRadius; TPoint.Init(InitX,InitY,InitColor); end; Procedure TCircle.Draw; begin SetColor(Color); {процедуры из модуля Graph} Circle(X,Y,Radius); end;
12 12 Гл. 11. ОБЪЕКТЫ В программе описаны два класса: класс TCircle – потомок класса TPoint. Деструктор Done наследуется, а методы Init и Draw на основе полиморфизма перекрываются. В конструкторе класса TCircle не только инициализируется дополнительное поле Radius, но и вызывается в явном виде конструктор «родителя». Это делается для того, чтобы проинициализировать и те переменные, которые «перешли по наследству» этому классу. Метод Draw класса TCircle описан заново, т.к. рисование окружности отличается от рисования точки. Приведенный пример относится к случаю простого полиморфизма, когда при вызове переопределенного метода тип объекта (класс), для которого вызывается данный метод, точно известен. При этом адреса методов- процедур, которые ассоциируются с именем Draw, и где размещаются команды этих методов, подставляются в вызовы данных методов на этапе компиляции. Такой процесс называется ранним связыванием – т.е. включением в машинный код точных адресов на те точки программы, с которых начинается размещение кода метода (такой метод называется статическим). Var Point : PPoint; Circle : PCircle; Begin... Point^.Draw; Circle^.Draw;... End.
13 13 Гл. 11. ОБЪЕКТЫ Для стандартизации работы с объектами, имеющими полиморфные методы, введено понятие позднего связывания, когда компилятор формирует косвенное обращение к адресу, хранящемуся в определенном месте памяти. Реальный адрес нужного метода не известен до момента выполнения программы. Этот метод подключается в процессе выполнения программы, когда однозначно определен тип объекта (класс). Класс С Метод А Метод В Класс С1 (потомок С) Метод А Метод В Наследуется Переопределяется раннее связывание позднее связывание Действия компилятора при обра- ботке статических методов объек- тов, связанных иерархически: 1. При вызове метода компилятор устанавливает тип объекта, вызы- вающего метод. 2. Установив тип, компилятор ищет метод в пределах типа объекта. Найдя его, компилятор назначает вызов этого метода. 3. Если метод не найден, то компилятор начинает рассматривать тип непосре- дственного прародителя и ищет метод, имя которого вызвано, в пределах ро- дительского типа. Если он найден, то вызов заменяется на вызов метода пра- родителя. Если нет, то компилятор «поднимается» еще на один уровень и т.д. При этом, если метод прародителя вызывает другие методы, то последние также будут методами прародителя, даже если потомки имеют свои собственные методы.
14 14 Гл. 11. ОБЪЕКТЫ Замещаемые (полиморфные) методы объектов, для которых необходимо реализовать механизм позднего связывания, называют виртуальными и отмечают в описании объекта стандартной директивой virtual. Одни и те же виртуальные методы должны иметь одинаковые заголовки у всех объектов данной иерархии. Метод, объявленный виртуальным в некотором классе, обязан быть виртуальным и во всех его наследниках. Использование механизмов позднего связывания возможно только для экземпляров объектов, описанных динамически, т.е. с размещением их не в сегменте данных, а в динамической памяти. Каждый класс, содержащий или наследующий виртуальные методы, имеет связанную с ним таблицу виртуальных методов (ТВМ), которая размещается в сегменте дан- ных программы. В этой таблице со- держится, в частности, информация о явных адресах всех виртуальных ме- тодов данного класса. При создании объекта (после выполнения метода- конструктора) в него добавляется специальное поле – указатель на ТВМ данного класса. Код программы адрес 3 ТВМ класса адрес 2 адрес 1... адреса виртуальных методов адрес ТВМ поле 1 поле 2... Динамический объект
15 15 Гл. 11. ОБЪЕКТЫ Type PPoint = ^TPoint; TPoint = object X, Y : Word; Color : Byte; constructor Init (InitX, InitY : Word; InitColor : Byte); destructor Done; procedure Draw; virtual; end; PCircle = ^TCircle ; TCircle = object(TPoint); Radius : Word; constructor Init (InitX,InitY,InitRadius:Word; InitColor : Byte); procedure Draw; virtual; end;... {описания методов - прежние}... Полиморфные методы объявлены как виртуальные:
16 16 Гл. 11. ОБЪЕКТЫ Var Point : PPoint; Circle : PCircle; P : array[1..2] of PPoint; i : Byte; Begin New(Point,Init); New(Circle,Init); P[1] := Point; P[2] := Circle; for i := 1 to 2 do P[I]^.Draw; End. ТВМ класса TPoint X Point^ Y Color Адрес ТВМ... Draw ТВМ класса TCircle Y Circle^ Color Radius Адрес ТВМ... Draw X Тип обоих переменных Point и Circle – указатель, поэтому можно ввести массив указателей. Присваивание Р[2] := Circle корректно с точки зрения совместимости типов, т.к. все объекты-потомки совместимы со своими предками (обратное не верно). Если бы метод Draw был статическим, то для рисования окружности потребовался бы, например, вызов: PСircle(P[2])^.Draw Удобство использования виртуальных методов и уменьшение вероятности активизации не того метода, который ожидается, становятся более заметны при увеличении числа и усложнении иерархии объектов.
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.