Средства объектно-ориентированного программирования Объектовые типы впервые появились в версии 5.5. Потенци- ально это новый подход к программированию, позволяющий сущест- венно повысить производительность труда программистов, сделать программы более компактными и легко расширяемыми. ООП зарожда- лось в языке Simula-67, затем развивалось с семейством языков Smalltalk. Сначала ООП использовалось как инструмент для исследова- тельской работы с большими накладными расходами, сейчас компи- ляторы получаю высокоэффективный код. Полностью "объектно-ори- ентированный" пакет Turbo Vision использовался для создания интегрированной среды TP 6.0. ОБЪЕКТЫ. ОСНОВНЫЕ ПОНЯТИЯ Объектовые типы похожи на записи (комбинированные типы), но ПОСЛЕ описания полей данных в объектовом типе можно зада- вать подпрограммы - процедуры и функции (методы). ОБЪЕКТ=ИНФОРМАЦИЯ+ПРАВИЛА ПОВЕДЕНИЯ Непосредственно в объектовом типе задаются только заго- ловки подпрограмм-методов, а полные их описания должны быть заданы отдельно. Имя подпрограммы составляется из имени объек- тового типа - "хозяина", символа "точка" и имени подпрограммы. Такое разделение дает большую наглядность объектовому типу, он может описываться как интерфейсный элемент модуля, а полные описания подпрограмм-методов могут быть размещены в разделе реализации модуля. Программа с использованием ООП является не бессистемной совокупностью данных и подпрограмм, а библиотекой объектов с полностью определенным поведением. Используя наследование, объекты все более усложняются, т.е. используется восходящее проектирование программ. Замечания 1. Методы, определенные в объектовом типе, имеют доступ ко всем полям этого типа. К полям можно обращаться и непос- редственно, используя составные имена, но это считается отс- туплением от объектно-ориентированного стиля: ВСЕ действия с информацией, заданной в объектовом типе, осуществляются пос- редством его методов. 2. Объекты похожи на модули. В ТР модуль отдельно хранит- ся и компилируется, но нельзя определить переменную "модульно- го типа". Для обектового типа можно создать произвольное число переменных этого типа, имеющих свои методы, посредством кото- рых эти объекты манипулируют значениями своих полей. 3. Если в модуле определен интерфейсный объектовый тип со многими методами, а в программе будут применяться только неко- торые методы, то в результирующий код попадут только те мето- ды, которые реально вызываются программой. [Фаронов] В ТР средства ООП связаны с тремя зарезервированными словами: OBJECT, CONSTRUCTOR (строитель), DESTRUCTOR (разруши- тель) и двумя стандартными директивами PRIVATE (частный, тай- ный) и VIRTUAL (фактический, действительный). ИНКАПСУЛЯЦИЯ - объединение данных и алгоритмов их обра- ботки, в результате чего и данные, и процедуры во многом теря- ют самостоятельное значение. Фактически это модульное програм- мирование нового уровня с большей смысловой связью. ООП в наибольшей степени подходит для создания библиотек программирования при разработке достаточно сложных программ. Попытки использовать ООП для программирования несложных алго- ритмических действий, расчетами по готовым формулам чаще всего выглядят искусственными нагромождениями ненужных языковых конструкций. А отладка сложных диалоговых программ очень тру- доемка ("критическая масса" 1000-1200 операторов языка) без их структурирования, т.е. создания фактически собственной библио- теки программирования. НАСЛЕДОВАНИЕ (Inheritance) - объявление объекта потомком ранее описанного объекта. От родителя наследуются все данные и методы, которые можно дополнить своими данными и методами. Имя родителя указывается в круглых скобках за словом OBJECT. Глав- ное преимущество наследования (самое мощное свойство ООП) - нет необходимости заново описывать уже существующие в объек- те-родителе поля и методы. Наследование распространяется на любые объекты, в том числе и на объекты-потомки: если в качестве родителя указано имя объекта, который сам по себе является потомком, то новый объект наследует свойства своего родителя и всех прародителей. Таким образом, создается дерево наследования от корня к ветвям и листьям. ПОЛИМОРФИЗМ - одним именем могут называться различные ал- горитмические действия в родственных объектах, т.е. объект-по- томок может заменять методы родителя (но не поля) на новые. [Фаронов, с.174] type TA=object; procedure Out; end; TB=object (TA); procedure Out; end; procedure TA.Out; begin writeln('AAAA') end; procedure TB.Out; begin writeln('BBBB') end; var A:TA; B:TB; begin A.Out; B.Out end. При запуске программы будет выдано AAAA BBBB Такое связывание объектов, полей с методами называется ранним - на этапе компиляции. Такие методы называются стати- ческими. Возможно позднее связывание данных с методами - на этапе исполнения программы. Описание метода дополняется директивой VIRTUAL, такие методы называются виртуальными. VIRTUAL предуп- реждает компилятор: "Пока ты не знаешь, что я хочу. Придет время - запроси образец". Для каждого типа объекта создается таблица виртуальных методов (ТВМ): адреса точек входа всех виртуальных методов. Фактическое связывание осуществляется при обращении к КОНСТРУКТОРУ - специальному методу (обычная проце- дура, но заголовок вместо PROCEDURE содержит CONSTRUCTOR. В момент обращения к констуктору в специальное поле объекта за- носится адрес нужной ТВМ, в результате чего ВСЕ виртуальные методы (в том числе и унаследованные от родителей) получают доступ к нужным полям. При позднем связывании полиморфизм распространяется не только от текущего уровня иерархии вниз, к потомкам, но также и вверх, к родителям. type TA=object; procedure Out; function OutStr:string; virtual; constructor Init; end; TB=object (TA); function OutStr:string; virtual; constructor Init; end; procedure TA.Out; begin writeln(OutStr) end; function TA.OutStr:string; begin OutStr:='AAAA' end; function TB.OutStr:string; begin OutStr:='BBBB' end; constructor TA.Init; begin end; constructor TB.Init; begin end; var A:TA; B:TB; begin A.Init; B.Init; A.Out; B.Out end. Будет выведено AAAA BBBB С помощью ТВМ родительский метод TA.Out "узнал" о сущест- вовании виртуального метода TB.OutStr и использовал именно его при обращении B.Out.