Основы программирования (947332), страница 53
Текст из файла (страница 53)
Модификация - это процесс добавления новых функциональных возможностей или изменения существующих свойств системы.Как правило, изменения затрагивают реализацию класса, не трогая его интерфейс, что при использовании ООП обычно обходится без особых неприятностей, так как процесс изменений затрагивает локальную область.Простота модификации позволяет сравнительно легко адаптироватьпрограммные системы к изменяющимся условиям эксплуатации, что увеличивает время жизни систем, на разработку которых затрачиваются огромныевременные и материальные ресурсы.Особенностью ООП является то, что объект или группа объектов могутразрабатываться отдельно, и, следовательно, их проектирование может находиться на различных этапах.
Например, интерфейсные классы уже реализованы, а структура классов предметной области еще только уточняется. Обычно проектирование начинается, когда какой-либо фрагмент предметной области достаточно полно описан в процессе анализа.31310. КЛАССЫ И ОБЪЕКТЫ В BORLAND PASCALОбъектная модель, реализованная в Borland Pascal, по современным меркам является упрощенной, но она позволяет изучить основные приемы объектно-ориентированного программирования и оценить его достоинства и недостатки.В настоящей главе рассмотрены средства, используемые для объявления классов иобъектов, и принципы создания «универсальных» классов.ЮЛ.
Объявление класса. Поля и методыС точки зрения синтаксиса класс представляет собой структурный типданных, в котором помимо полей разрешается описывать прототипы (заголовки) процедур и функций, работающих с этими полями данных. По формеописание класса напоминает запись.Как уже упоминалось ранее, процедуры и функции, заголовки которыхописаны в классе, получили иазваиио методов.Описание типа класс выполняется следующим образом:Туре <имя класса> = object<описание полей класса><прототипы методов>end;...Тела методов класса описываются после объявления класса.
Причем взаголовке метода можно не повторять списка параметров, но перед именемметода необходимо указать имя класса, отделив его от имени метода точкой:Procedure <имя класса>.<имя метода>;<локальные ресурсы процедуры>Begin<тело процедуры>End;...или31410.
Классы и объекты в Borland PascalПлощадь?КомнатаaTRoomlength, widthSquare()бРис. 10.1. Объект Комната {а) и реапизующий класс (б)Function <имя класса>. <имя метода>;<;покальные ресурсы функции>Begin<тело процедуры>End;...Пример 10.1.
Разработать класс для реализации объекта Комната, который должен хранить длину и ширину комнаты и отвечать на запрос о площади комнаты (рис. 10.1, а).Объект Комната характеризуется двумя параметрами: длиной и шириной, значит соответствующий класс должен включать два поля, в которыхэти значения будут храниться (рис.
10.1, б). Единственное сообщение, на которое должен реагировать объект, - запрос о площади комнаты, следовательно, класс должен включать метод-функцию, которая должна возвращать значение площади комнаты.Туре TRoom = objectlength, width:real;{попя: длина и ширина комнаты}function Square .real; {метод определения площади}end;Function TRoom.Square; {тело метода определения площади}BeginSquare:= length"^ width;End;...Поскольку поля и методы описаны в одном классе, все поля класса доступны методам класса без дополнительного указания.Физически это реализуется следующим образом. Каждая переменная объект данного класса - при объявлении получает свой набор полей класса.Эти поля собраны в запись, внешнее имя которой совпадает с именем объекта.
Любой метод класса, вызванный для конкретного объекта, неявно получает специальный параметр Self значением которого является адрес записи,объединяющей все поля этого объекта. Этот параметр иногда называют обобщенным внутренним именем объекта. Реально обращение к полям конкретного объекта происходит через это обобщенное имя:315Часть 2. Объектно-ориентированное программированиеFunction TRoom.Square; {тело метода определения площади}BeginSquare: = Self, length * Self, width;End;...При необходимости имя Self можно указывать явно, например @Selfадрес записи, содержащей поля объекта (естественно, такое обращение возможно только из методов, вызываемых для конкретного объекта, так как внеобъекта это имя не определено).10.2. Объявление объекта.
Инициализация полейОписав класс, мы можем объявить любое количество объектов этогокласса, причем можно объявить отдельные объекты, массивы объектов и указатели на объекты данного класса.Например:Var A.'TRoom;{объект А класса TRoom}B:array[1..5] of TRoom; {массив объектов типа TRoom}Type pTRoom=^TRoom; {тип указателя на объекты класса TRoom}Var рС: pTRoom;{указатель на объекты класса TRoom}Как и для любой другой динамической переменной, для динамическогообъекта необходимо выделить память, а после его использования -- освободить память.Выделение памяти осуществляют процедурой New или функцией New.Например:New(pC);илиpC:=New(pTRoom);...Для освобождения памяти используют процедуру Dispose.
Например:Dispose(рС);...Работа с динамическими объектами классов, построенных с использованием наследования со сложным полиморфизмом, имеет свои особенности, имы вернемся к их рассмотрению в параграфе 11.7.Обращение к полям и методам объекта. Обращение к полям и методам объекта выполняется так же, как к полям записей:• с использованием точечной нотации:<имя объекта>.<имя поля> или <имя объекта>.<имя метода>;• с использованием оператора with:31610.
Классы и объекты в Borland Pascalwith <имя объекта> dobegin...<имя поля>......<имя метода>...end; ...Например:а) v:=A. length;б) s:= A.Square;в) s:=s+В[i],Square;T)pC4ength:=3;...Инициализация полей объекта. Поля объекта должны инициализироваться. Инициализация полей объекта может осуществляться тремя способами:• прямым занесением в поле, например:Program ex;Type TRoom = objectlength, width:real;{поля: длина и ширина комнаты}function Square;real;{мотод определения площади}end;Function TRoom.Square; {тело метода определения площади}BeginSquare:^ length"^ width;End;Var A:TRoom; {объявляем объект-переменную}BeginAJength:-3.5;{инициализируем поля объекта}У4. width:-5J;1¥гИе1п(*Площадъ комнаты равна \A.Square);End• с использованием типизированных констант - синтаксис описаниясовпадает с синтаксисом типизированных констант типа «запись»:Program ex;Type TRoom = objectlength, width:real;{nonH: длина и ширина комнаты}function Square;real;{MQTOJX определения площади}end;317Часть 2.
Объектно-ориентированное программированиеFunction TRoom.Square; {тело метода определения площади}BeginSquare:^ length"^ width;End;ConstA:TRoom = (length:3.5; width:5.1); {объявляем константу}BeginWriteLn('Площадь комнаты равна \A.Square);End• посредством специального метода - очень часто в качестве такого метода используют специальную инициализирующую процедуру, которую рекомендуется называть Init:Program ex;Type TRoom = objectlength, width.real;{пояя: длина и ширина комнаты}function Square:real;{MQTOJX определения площади}procedure //i//(7,H';/'^aO;{инициализирующий метод}end;{метод определения площади}Function TRoom.Square;BeginSquare: = length* width;End;{инициализирующий метод}Procedure TRoontlnit;Beginlength:=l; width:-w;End;Var A:TRoom; {объявляем объект-переменную}{основная программа}BeginAJnit(3.5y5.1); {инициализируем поля объекта}WriteLn('Площадь комнаты равна \A.Square);End,Операция присваивания объектов.
Над объектами одного класса определена операция присваивания. Физически при этом происходит копирование полей одного объекта в другой методом «поле за полем»:Const A:TRoom=(length:3.7;:5,2);Var B:TRoom;..,В:=А; {теперь B.length=3.7, а B.width=5.2}31810. Классы и объекты в Borland PascalСуществуют некоторые особенности выполнения операции присваивания для объектов родственных классов и полиморфных объектов. Они описаны в параграфах 11.1 и 11.5.10.3. Библиотеки классов. Ограничение доступак полям и методамОдним из достоинств ООП является возможность создания библиотекклассов, на базе которых затем конструируют классы для реализации объектов реальной задачи.
Библиотечные классы при этом описывают в интерфейсной части модуля, а тела методов - в разделе реализации.Например:Unit Room;InterfaceType TRoom = objectlength, width:real; {поля: длина и ширина комнаты}function Square:real; {метод определения площади}procedure /w/Y(7,w.Te(2/j;{инициализирующий метод}end;ImplementationFunction TRoom.Square; {метод определения площади}BeginSquare:= length"^ width;End;Procedure TRoom.Init;{инициализирующий метод}Beginlength: =1;width: =w;End;End.В этом случае основная программа будет подключать соответствующиймодуль и работать с классом, его полями и методами, как с рес> рсами библиотеки:Program ex;Uses /loom;{подключаем модуль с описанием класса TRoom}Var A:TRoom; {объявляем объект-переменную}BeginAJnit(3.5y5.1); {инициализируем поля объекта}WriteLnCКомната: длина= ', AJength,V ширииа= \ A.width);319Часть 2. Объектно-ориентированное программированиеWriteLnCПлощадь комнаты = \A.Square);End.В Borland Pascal можно ограничить доступ к полям и методам класса впределах модуля.
Для этого описание класса делится на специальные секции:public-секция, содержащая описание общих или общедоступных полейи методов класса;private - секция, содержащая описание внутренних или скрытых полейи методов класса.В описании класса эти секции могут чередоваться, причем, если секциикомпонент не указаны, то по умолчанию принимается, что эти компонентыдоступны как общие:Unit <имя модуля>;InterfaceТуре <имя класса>= object<описание общих полей и методов>private<описание внутренних полей и методов>public<описание общих полей и методов>private<описание внутренних полей и методов>end;...Например, в нашем случае, если объекты класса TRoom используютсятолько для получения информации о площади комнаты, то можно поля описать в секции private, но тогда доступ к этим полям из программы станет невозможным:Unit RoomHiden;InterfaceType TRoom = objectprivate {скрытые компоненты класса}length, width:real; {поля: длина и ширина комнаты}public{общие компоненты класса}function Square.real;{метод определения площади}procedure Init(l,w:real);{инициализирующий метод}end;ImplementationFunction TRoom.Square; {метод определения площади}BeginSquare:= length"^ width;End;32010, Классы и объекты в Borland PascalProcedure TRoomJnit;{инициализирующий метод}Beginlength: =1; width: =w;End;End.Сокрытие некоторых полей и методов класса упрощает интерфейс класса, т.
е. программист, использующий библиотечный класс, не получает лишней для него информации о внутренних механизмах реализации состояния иповедения объектов данного класса. Одновременно с этим программист, занимающийся разработкой библиотечных классов, получает возможностьвносить изменения в реализацию класса, не заботясь об изменении программ, использующих объекты данного класса.10.4. Практикум.