Глава 11. ОБЪЕКТЫ Описание классов, создание объектов Ограничение доступа к полям и методам Создание библиотек классов Реализация принципа наследования.

Презентация:



Advertisements
Похожие презентации
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Advertisements

Подпрограммы 1.Принцип модульности 2.Область действия переменных 3.Параметры подпрограмм 4.Модули.
Модули, созданные программистом Любознательные юные программисты ещё не знают что их ожидает =)
Delphi. 11 класс.. Познакомиться с понятиями : Инкапсуляция Интерфейс объекта Классы, экземпляр класса Наследование, иерархия полиморфизм.
Элементы ЯПВУ. УКАЗАТЕЛИ. C / С++Pascal Вся динамическая память в Pascal это сплошной массив байтов (куча). Адрес начала кучи храниться в переменной HeapOrg,
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Методология объектно- ориентированного программирования.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
Введение в объектно- ориентированное программирование.
Понятие подпрограммы Стандартные процедуры и функции.
В. И. Дихтяр ИНФОРМАТИКА Российский университет дружбы народов Институт гостиничного бизнеса и туризма Раздел 3Моделирование объектов и процессов и его.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Принципы объектно-ориентированного программирования Объектная модель Наследование Инкапсуляция Полиморфизм.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
В. Дихтяр ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ (для бакалавров) Российский университет дружбы народов Институт гостиничного бизнеса и туризма Раздел 1.Разработка.
Модули Информатика. Наличие модулей в Turbo-Pascal позволяет программировать и отлаживать программу по частям, создавать библиотеки программ и данных.
Файловый тип данных Файл – это область памяти на внешнем носителе, в которой хранится некоторая информация. В языке Паскаль файл представляет собой последовательность.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
1 Модули Лекция 4 План 1.Общая характеристика модулей. 2.Модуль CRT и GRAPH 3.Нестандартные модули. Составление программ с использованием модулей Лектор:
Одномерный массив. Цель урока: познакомить учащихся с понятием одномерный массив Задачи: дать определение массива дать представление: об описании массива.
Транксрипт:

Глава 11. ОБЪЕКТЫ Описание классов, создание объектов Ограничение доступа к полям и методам Создание библиотек классов Реализация принципа наследования Полиморфизм Раннее связывание Позднее связывание, виртуальные методы

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 Гл. 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 Гл. 11. ОБЪЕКТЫ if Mouse^.Keys > 0 then begin Mouse^.On;... Mouse^.Off; end; Ограничение доступа к полям и методам Фрагмент ошибочен с точки зрения объектного подхода, поскольку нарушен принцип инкапсуляции. Получать информацию об объекте следует только при помощи операции селектора, т.е. специальным методом-операцией.

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 Гл. 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 Гл. 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 Гл. 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 Гл. 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 Гл. 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. ОБЪЕКТЫ С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 Гл. 11. ОБЪЕКТЫ В программе описаны два класса: класс TCircle – потомок класса TPoint. Деструктор Done наследуется, а методы Init и Draw на основе полиморфизма перекрываются. В конструкторе класса TCircle не только инициализируется дополнительное поле Radius, но и вызывается в явном виде конструктор «родителя». Это делается для того, чтобы проинициализировать и те переменные, которые «перешли по наследству» этому классу. Метод Draw класса TCircle описан заново, т.к. рисование окружности отличается от рисования точки. Приведенный пример относится к случаю простого полиморфизма, когда при вызове переопределенного метода тип объекта (класс), для которого вызывается данный метод, точно известен. При этом адреса методов- процедур, которые ассоциируются с именем Draw, и где размещаются команды этих методов, подставляются в вызовы данных методов на этапе компиляции. Такой процесс называется ранним связыванием – т.е. включением в машинный код точных адресов на те точки программы, с которых начинается размещение кода метода (такой метод называется статическим). Var Point : PPoint; Circle : PCircle; Begin... Point^.Draw; Circle^.Draw;... End.

13 Гл. 11. ОБЪЕКТЫ Для стандартизации работы с объектами, имеющими полиморфные методы, введено понятие позднего связывания, когда компилятор формирует косвенное обращение к адресу, хранящемуся в определенном месте памяти. Реальный адрес нужного метода не известен до момента выполнения программы. Этот метод подключается в процессе выполнения программы, когда однозначно определен тип объекта (класс). Класс С Метод А Метод В Класс С1 (потомок С) Метод А Метод В Наследуется Переопределяется раннее связывание позднее связывание Действия компилятора при обра- ботке статических методов объек- тов, связанных иерархически: 1. При вызове метода компилятор устанавливает тип объекта, вызы- вающего метод. 2. Установив тип, компилятор ищет метод в пределах типа объекта. Найдя его, компилятор назначает вызов этого метода. 3. Если метод не найден, то компилятор начинает рассматривать тип непосре- дственного прародителя и ищет метод, имя которого вызвано, в пределах ро- дительского типа. Если он найден, то вызов заменяется на вызов метода пра- родителя. Если нет, то компилятор «поднимается» еще на один уровень и т.д. При этом, если метод прародителя вызывает другие методы, то последние также будут методами прародителя, даже если потомки имеют свои собственные методы.

14 Гл. 11. ОБЪЕКТЫ Замещаемые (полиморфные) методы объектов, для которых необходимо реализовать механизм позднего связывания, называют виртуальными и отмечают в описании объекта стандартной директивой virtual. Одни и те же виртуальные методы должны иметь одинаковые заголовки у всех объектов данной иерархии. Метод, объявленный виртуальным в некотором классе, обязан быть виртуальным и во всех его наследниках. Использование механизмов позднего связывания возможно только для экземпляров объектов, описанных динамически, т.е. с размещением их не в сегменте данных, а в динамической памяти. Каждый класс, содержащий или наследующий виртуальные методы, имеет связанную с ним таблицу виртуальных методов (ТВМ), которая размещается в сегменте дан- ных программы. В этой таблице со- держится, в частности, информация о явных адресах всех виртуальных ме- тодов данного класса. При создании объекта (после выполнения метода- конструктора) в него добавляется специальное поле – указатель на ТВМ данного класса. Код программы адрес 3 ТВМ класса адрес 2 адрес 1... адреса виртуальных методов адрес ТВМ поле 1 поле 2... Динамический объект

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 Гл. 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 Удобство использования виртуальных методов и уменьшение вероятности активизации не того метода, который ожидается, становятся более заметны при увеличении числа и усложнении иерархии объектов.