Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
выш.мат. методичка.DOC
Скачиваний:
32
Добавлен:
13.02.2015
Размер:
1.71 Mб
Скачать

12.2. Понятие объекта

Основным понятием ООП и элементом программы является объект, сочетающий в себе как совокупность данных, так и действий над ними. Тип-объект в Тurbo Раsсаl напоминает тип-запись, однако вместо зарезервированного слова rесоrd используется слово оbject, а кроме полей, представляющих данные, в нем перечислены и заголовки подпрограмм, называемых методами. При задании та­кого типа после зарезервированного слова оbject перечисляются все поля объек­та и заголовки методов, после чего пишется слово еnd. Так, в рассматриваемом примере используется тип (Соnnection (связь элементов):

tyре

tCоnnection = оbject

РredElem: Роinter;

NextElem: Pointer;

рrосеdure РutPredElem(PredEl: Pointer);

рrосеdure РutNextElem(NextЕl: Роinter);

function GetPredElem: Роinter; I

function GetNextElem: Роinter;

еnd;

В этом типе РredЕlem и NextЕlem - указатели на предыдущий и последующий элементы в структуре (если соответствующего элемента нет, указатель имеет значение nil). Используются указатели типа Роinter, т.к. элементы могут быть различными: они могут быть и элементами строки, и строками. Далее идут заголовки двух процедур и двух функций, позволяющих либо задавать, либо получать значения указателей объекта.

Естественно, что затем все используемые методы должны быть описаны так же, как это делается для подпрограмм в модулях. При этом Допускается записывать сокращенный заголовок метода, однако перед ним следует через точку записать имя типа-объекта, к которому относится данная подпрограмма:

рrосеdure tConnection.РutPredElem;

begin

РredЕlеm:=РredЕl;

еnd;

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

Некоторые объекты программы, особенно находящиеся в начале иерархичес­кого дерева, могут и не соответствовать каким-либо реальным объектам. Так, например, объекты типов tСоnnection (связь), tStructure (структура) и tOperation (операция) не имеют какого либо физического воплощения - они указывают лишь на некоторые двойства других, реальных объектов, таких, как строки, эле­менты строк. Однако выделение этих общих свойств в отдельные объекты бывает удобно, т. к. позволяет затем не повторять их многократно при описании уже ре­альных объектов. Такие объекты называются абстрактными, и переменных таких типов в программе, как правило, не бывает.

12.2.1. Инкапсуляция

Под термином "инкапсуляция" понимается совмещение в одном объекте как параметров, так и действий над ними. При этом включенные в объект подпрограммы (методы), как правило, оперируют с данными этого объекта или обращаются к методам объектов-предков (см. п. 14.2.2). Это позволяет объединить в одном месте все свойства объекта, что облегчает понимание работы программы, ее отладку, модификацию. Так, например, все свойства связей между элемента­ми в структуре, текста сосредоточены в типе tСоnnection. Как правило, к данным объекта извне непосредственно не обращаются, хотя это и возможно. Для обра­щения к данным обычно используют соответствующие методы. Так, в рассматри­ваемом примере для этой цели служат четыре метода РutPredElem, РutNextElem, GetPredElem и GetNextElem, с помощью которых можно задавать и получать зна­чения указателей на предыдущий и последующий элемент. Это обстоятельство не является надуманным. В нашей повседневной жизни так обычно и происхо­дит - мы используем те, или иные параметры опосредованно. Если взять уже упоминавшийся пример с компьютером, то у него есть такой параметр, как размер свободной памяти на жестком диске. Однако вряд ли владелец компьюте­ра для определения этого параметра будет непосредственно отсчитывать байты — для этой цели служат специальные подпрограммы.

Такое опосредованное обращение к данным позволяет избежать во многих случаях непредвиденных нежелательных изменений параметров. В Тurbo Раscal с этой целью используется специальное зарезервированное слово рrivate (приватный), в принципе запрещающее непосредственное обращение к тем или иным данным и методам объекта вне модуля, в котором описан объект. В версия 7.0 (приватная секция может размещаться в любом месте объекта (раньше -только в конце (после обычных, доступных параметров и методов). Так, если необходимо запретить из основной программы обращаться к данным объекта типа tСonnection (напомним, что основная программа редактора находится в отдель­ном файле), этот тип можно описать следующим образом:

tyре

tCоnnection = оbject

рrосеdure РutPredElem(PredEl: Pointer);

рrосеdure РutNextElem(NextЕl: Роinter);

function GetPredElem: Роinter; I

function GetNextElem: Роinter;

private

РredElem: Роinter;

NextElem: Pointer;

еnd;

Если приватная секция находится не в конце объекта, то для ограничения диа­пазона действия зарезервированного слова рrivate следует после приватной секции поместить зарезервированное слово public (доступный извне) -только в вер­сии 7.0:

tyре

tCоnnection = оbject

private

РredElem: Роinter;

NextElem: Pointer;

public

рrосеdure РutPredElem(PredEl: Pointer);

рrосеdure РutNextElem(NextЕl: Роinter);

function GetPredElem: Роinter; I

function GetNextElem: Роinter;

еnd;