Объектно-ориентированное программирование учебное пособие



страница5/15
Дата17.04.2013
Размер1.64 Mb.
ТипУчебное пособие
1   2   3   4   5   6   7   8   9   ...   15

3.1. Совместное использование кода и данных
Объявление объекта Турбо Паскаля вначале выглядит так же, как и объявление записи; однако кроме полей данных типа Record оно содержит методы - процедуры и функции, которые оперируют с полями данных, как показано ниже:
TYPE

FrameRec = RECORD

TR: Trect;

Vis: Boolean;

Owner: hwnd;

END;
TFrame1=OBJECT ( Tobject )

TR: Trect;

Vis:Boolean;

Owner: hwnd;

constructor init ( iTR:TR; Own: hwnd);

destructor done; virtual;

procedure draw ( DC : hDC); virtual;

procedure hide;

procedure move ( x,y : integer);

END;

В этом примере секция данных окна включает тип Trect, который определяет размеры окна, логический тип, который определяет, видимо окно или нет, и дескриптор окна. Тип Record на этом завершается, но объектный тип также содержит ряд методов для работы с этими данными. Конструктор инициализирует объект и поле данных< а деструктор выполняет требуемые операции по освобождению памяти от объекта. Остальные методы отображают и изменяют объект - окно. Объединение данных и методов, воздействующих на эти данные, называется инкапсуляцией. В самой ее строгой форме инкапсуляция требует, чтобы вы никогда не обращались к полям объекта непосредственно - вы должны всегда использовать метод.

3.3. Повторное использование объектов
Одной инкапсуляции недостаточно, чтобы пробудить интерес к объектно-ориентированному программированию. Создание множества объявления данных и методов для каждого объекта может скоро надоесть. К счастью, вы не обязаны этого делать - вы можете объявлять один тип объекта потомком другого. Тип потомка наследует все поля и методы предка, так что вам не нужно описывать их снова и снова. Например,
TYPE

TFrame2 = OBJECT ( Tframe1)

Col : LongInt;

constructor Init ( itr : TRect ; Own : hwnd ; icol : LongInt);

Procedure Draw ( DC: hDC ) ; virtual;

END ;
Здесь объект Tframe2 наследует все поля данных Tframe1 и добавляет новое поле Col для хранения цвета. Чтобы инициализировать новое поле, требуется новый конструктор. Единственный метод, который должен быть изменен, - это Draw, который теперь должен выводить окно в цвете. Tframe2 перекрывает (override) существующий метод Draw и наследует оставшиеся методы. Объект - потомок наследует все поля данных предка и может содержать новые поля данных. По аналогии с полями наследует все методы предка и может так же содержать новые. Но в отличие от полей данных, существующие методы могут быть перекрыты, чтобы изменить или расширить реализуемые им функции. Если существующий метод является виртуальным, объявление перекрывающего метода должно быть идентично объявления метода предка; если он является статическим, объявление может отличаться.
Наследование упрощает расширение возможностей объекта, просто определяя потомка и добавляя особенности, которые вам необходимы.
3.4. Скрытые объекты
Обычные правила контроля соответствия типов Паскаля несколько упрощаются, когда это касается объектов. Указатель, объявленный как ссылка на один тип объекта, может указывать на любую переменную, чей тип наследуется от объявленного типа. Если процедура имеет параметр VAR, который имеет объектный тип, вы можете передавать в качестве параметра любой тип потомка этого типа. Следовательно, в этих ситуациях вы не можете и вам не надо знать фактический тип объекта. Объект полиморфен, т. е. он может иметь различные формы. Ваша программа может вызвать любой виртуальный метод, который представлен в объявленном типе объекта, и будет вызван именно тот метод, который соответствует фактическому типу. Это является наиболее удивительным аспектом объектно-ориентированного программирования. Предположим, что вы пишите и компилируете модуль, который вызывает виртуальный метод полиморфного объекта. Без повторной компиляции ваш модуль может вызвать этот метод для объекта, который не был еще даже задуман тогда, когда вы писали это!

Предположим, что мы расширяем объект Tframe1 иным способом, чтобы он отображал некоторый текст на экране, и делаем это следующим образом:
TYPE

Tframe3 = OBJECT ( TFrame1 )

Txt : Pchar;

CONSTRUCTOR Init ( itr : Trect ; Own : hwnd ; itxt :Pchar );

DESTRUCTOR Done ; virtual;

PROCEDURE Draw ( DC :hDC ); virtual;

END ;

Этот потомок объекта Tframe1 имеет поле Pchar, содержащее текст. Конструктор расширяется для инициализации этого текста, и новый метод Draw выводит окно с текстом. Поскольку текст является переменной типа Pchar,- указатель на строку, завершающуюся нулем, - он должен освобождаться одновременно с освобождением объекта. Следовательно, TFrame3 перекрывает деструктор Done.

Поскольку Draw - виртуальный метод, отсюда следует, что для каждого потомка будет вызван правильный код. Объекты Tframe1 будут отображаться как черные окна, Tframe2 - как цветные окна и Tframe3 - как окна, содержащие текст.
3.5. Модульность
Хорошо отлаженные объекты являются чрезвычайно “ самосодержащими” и, следовательно, легко могут многократно использоваться и по мере необходимости расширяться. Объект взаимодействует с остальной частью программы только строго определенными способами. Строго говоря, основная программа не должна иметь никакого доступа к полям данных объекта, за исключением методов этого объекта. Кроме того, насколько это возможно, объекты должны ограничивать свои операции только их собственными данными и не должны быть связанными ни с какими глобальными переменными, а также не должны изменять их.

Модульность также помогает при управлении обработкой ошибок. Объект, разработанный с учетом требований модульности, подобен интегральной схеме. Сигналы поступают в схему и поступают от нее только через контакты (методы); нет никаких паразитных электрических соединений с другими элементами. Чтобы создавать прикладную программу, вы выбираете соответствующие компоненты и соединяете их. Именно так работает OWL (Object Windows Libraries): подключаете объект основного окна, некоторые порождаемые окна и несколько управляющих элементов - и ваша прикладная программа готова. Вы, вероятно, испытывали чувство, что каждая исправленная вами ошибка порождает еще две? Когда объекты связываются друг с другом ровно настолько, насколько это необходимо, упрощается процесс отладки. Если вы можете локализовать ошибку до определенного объекта, вы можете легко выделить этот объект, особенно используя программу, специально созданную для его проверки. Если вы обнаружили и исправили ошибку, то можете просто подключить восстановленный объект обратно в программу. Поскольку объект является “ самосодержащим ”, то изменения, которые вы в него внесли, вряд ли могут вызвать возникновение ошибки в другом месте.

Из этого следует, что модульное программирование облегчает разработку больших проектов. Работа нескольких программистов над одним проектом всегда усложняет дело, а разделение работы на отдельные объекты упрощает его. Другие члены группы не должны знать о том, что происходит внутри ваших объектов, вы только даете им объявление заголовка объекта, чтобы они знали, какие методы доступны, и описание того, что делает каждый метод. Вы можете также как угодно сильно изменять внутренние структуры ваших объектов, не беспокоясь о своих коллегах. До тех пор, пока заголовки методов остаются неизменными, все модификации внутренних структур объекта не оказывают никакого воздействия на другие объекты.

Модульность также удобна для макетирования. Для определенного объекта может возникнуть необходимость создать метод, который реализует сложный вычислительный алгоритм, и его написание будет отнимать много времени. Для того чтобы создание этого метода не задерживало создание всего проекта, вы можете поставить “ внешнюю заглушку”, которая представляет собой объект с методом, возвращающим заранее известное значение. Тогда вы можете работать над сложным методом столько времени, сколько потребуется, не задерживая работу другим коллегам, если они есть, и, не отвлекая свое внимание на более легкие детали.
3.6. Надежность
Следствием тех же особенностей, которые придают объектно-ориентированным программам модульный характер, является их высокая надежность. Хорошо спроектированные объекты очень слабо связаны с другими объектами; они соединяются друг с другом только тогда, когда это абсолютно необходимо. Таким образом, сводится к минимуму вероятность возникновения побочных эффектов и изменений в глобальных переменных, устраняя, таким образом, причины возникновения общих для большинства приложений ошибок. Когда вам нужен измененный объект, вы не корректируете исходный текст, что могло бы привести к возникновению новых ошибок. Вместо этого вы расширяете объект, создавая его потомка, который перекрывает или добавляет методы к уже имеющемуся объекту. В этом случае должны проверяться и отлаживаться только новые методы.

Объекты также повышают надежность программ, облегчая разбиение проекта на отдельные относительно небольшие части. Одному человеку практически невозможно исследовать и протестировать весь проект, но каждый объект перед его подключением к проекту может быть полностью проверен. Поскольку взаимодействие между объектами минимально, то объекты, которые работают правильно в автономном режиме, почти наверняка будут работать правильно и в собранном виде.
3.7. Возможность многократного использования
Как часто вам приходится создавать действительно с “нуля” новую программу? Большая часть программирования представляет собой повторное использование одних и тех же или подобных подпрограмм после значительного или незначительного переделывания. Теоретически мы все пишем исходные тексты, которые могут быть многократно использованы, экономя, таким образом, массу времени при разработке. На практике же до появления объектно-ориентированного программирования написание исходного текста, который мог бы быть многократно использован, является довольно сложной задачей. Хотя для многократного использования кода объекты абсолютно не нужны, ничто в обычном Паскале не вынуждает применять многократное использование, и вы не извлекаете из этого никаких непосредственных выгод. Если вы создаете ваши объекты настолько модульными, насколько это возможно, то будет также повышаться степень их многократного использования, и вы сразу же оцениваете все эти преимущества. Когда объект не зависит от глобальных переменных или когда, не входящего в него самого, вы можете легко включать его в другую программу.

Тот факт, что программы Windows имеют стандартный пользовательский интерфейс, помогает многократно использовать объекты. Если вы изобретаете блок диалога выбора файла со всеми необходимыми функциями, то можете использовать в любой программе, не заботясь о том, будет ли он соответствовать стиль этой программы. На самом деле, если вы посмотрите в подкаталог OWL, то найдете такой объект там. Чтобы создавать объекты с возможностью их многократного использования, вы можете добавлять методы, которые не являются необходимыми непосредственно в создаваемой вами в данный момент программе. Например, для объекта, представляющего собой связанный список объектов, необходимо иметь возможность добавления новых объектов к списку. Этого может быть достаточно для вашего проекта, но для многократного использования связанного списка объектов необходимо включить в него и другие методы типа нахождения и удаления заданного объекта, добавления объекта в определенную позицию в списке или определения, имеется ли объект в списке. Вы могли бы, конечно, добавить эти методы позже - в потомке объекта связанного списка. Однако если вы знаете методы, которые, скорее всего, будут необходимы позже, создавайте их сейчас.

Пытаясь максимально использовать возможности многократного использования, вы можете решить создавать для самого общего объекта OWL виртуальные методы. Реакции на каждую более чем 500 функций API - ведь в конечном итоге для объекта потомка может возникнуть необходимость в перекрытии любого из этих методов. Однако это может занять большую часть вашего сегмента данных. Для каждого типа объектов, к которому имеется ссылка в программе, создается таблица виртуальных методов, которая содержит 4 - байтный адрес каждого виртуального метода независимо от того, является он унаследованным или перекрытым. Это требует 2К данных на каждый тип объекта, а в программе OWL могут использоваться десяток таких типов. По умолчанию 16К автоматического сегмента данных используется для стека и локальной кучи, поэтому фактически только 48К доступны для данных. Чтобы предотвращать заполнение сегмента данных множеством VMT, в TPW изменяется механизм динамических методов.
3.8. Объектные ключевые слова Турбо Паскаля
Полезно знать общие термины, используемые в объектно-ориентированном программировании, но так же полезно знать специфические термины, используемые в реализации Турбо Паскаля. Даже если вы еще не решили, будете ли вы применять объектно-ориентированное программирование, вы должны знать эти термины хотя бы для того, чтобы не использовать их в качестве идентификаторов.
Зарезервированные слова

Зарезервированные слова в Турбо Паскале недоступны для их использования в качестве идентификаторов. Например, вы не можете назвать переменную -She, а процедуру - procedure. Зарезервированные слова, которые относятся к объектам, это Constructor, Destructor , Object.

Конечно же, наиболее важное из них -Object. Оно появляется в объявлениях типа и очень похоже на зарезервированное слово Record. Подобно записи, объект имеет нуль или больше полей данных. Но в отличие от записи, он также имеет методы (процедуры и функции, которые оперируют с полями данных). Эти методы появляется в объявлении объекта как заголовок процедуры или функции - тело подпрограммы находится дальше. Часто объявление объектного типа помещается в секции интерфейса модуля, а реальные методы помещаются в секции реализации. Вы можете включить имя существующего объектного типа в круглые скобки после ключевого слова Object , указывая, что определяемый объект - потомок существующего объекта.

Любой объектный тип, определение которого включает виртуальные методы, должен иметь, по крайней мере, один конструктор. Эта подпрограмма служит для инициализации VMT (virtual method table) и, если необходимо, DMT (dynamic method table). Вы должны вызывать конструктор прежде, чем что-то делаете с таким объектом. Часто конструктор будет также выполнять некоторую инициализацию полей данных и операции выделения необходимых ресурсов системы Конструкторы могут инициализировать объект, загружая поля данных из потока. Поэтому конструкторы обычно называют либо Init, либо Load.

В общем случае, вам не следует вызывать конструктор из другого метода; однако, если вы так делаете, то должны быть абсолютно уверены, что задали имя конструктора полностью, т. е. поставили перед именем конструктора имя объектного типа с точкой в конце, как показано ниже:

ParentObject . Init

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

Метод - конструктор инициализирует объект и выделяет ресурсы, в которых он нуждается, деструктор служит для освобождения этих ресурсов. Деструктор должен освободить всю память в куче, используемую объектом, закрывать файлы и выполнять подготовку объекта к уничтожению. Деструкторы обычно называются Done. В иерархии объектов OWL корневой объект Tobject имеет виртуальный деструктор, который называется Done, а остальные OWL - объекты определяют или наследуют деструктор Done. Поскольку деструктор тесно связан с процессом освобождения ресурсов, Турбо Паскаль позволяет вам включать вызов деструктора в качестве необязательного второго параметра для встроенной подпрограммы Dispose. Всякий раз, когда вы объявляете локальную переменную объектного типа, вы должны вызывать деструктор перед завершением процедуры, в которой переменная объявлена.

Конструктор необходим для каждого объекта, который определяет или наследует виртуальные методы; деструктор требуется, только если объект выделяет ресурсы, которые должны возвращаться прежде, чем объект освобождается. Однако включение деструктора в вызове Dispose позволяет компилятору освобождать правильное количество байтов даже тогда, когда динамический объект используется полиморфно. Желательно включать виртуальный метод - деструктор в корень или близко к корню вашей иерархии объектов, даже если он состоит из пустой цепи Begin ... End.
1   2   3   4   5   6   7   8   9   ...   15

Похожие:

Объектно-ориентированное программирование учебное пособие icon13. Основные принципы Объектно-Ориентированного Программирования (ооп) Объектно-Ориентированное Программирование
Объектно-Ориентированное Программирование это методология программирования, которая основана на представлении программы в виде совокупности...
Объектно-ориентированное программирование учебное пособие iconОбъектно-ориентированное программирование на языке Delphi
Методическое пособие предназначено для изучения основ объектно-ориентированного языка программирования Delphi (ооп) без ориентации...
Объектно-ориентированное программирование учебное пособие iconОбъектно-ориентированное программирование

Объектно-ориентированное программирование учебное пособие iconВизуальное объектно-ориентированное программирование. Графический интерфейс: форма и управляющие элементы

Объектно-ориентированное программирование учебное пособие iconСоздание web-сайтов, разработка программного обеспечения, объектно-ориентированное программирование, проектирование баз данных

Объектно-ориентированное программирование учебное пособие iconИнтегрированная среда разработки языка Visual Basic
...
Объектно-ориентированное программирование учебное пособие iconКурс: Объектно-ориентированное программирование
Напишите программу для общения через Internet. Программа должна состоять из двух частей: сервер и клиент. Сервер стартует в качестве...
Объектно-ориентированное программирование учебное пособие iconПрограммирование простых типов данных
Учебное пособие предназначено для студентов физического факультета, изучающих курс "Программирование и вычислительная физика"
Объектно-ориентированное программирование учебное пособие iconЗадание к лабораторным работам по курсу “Объектно-ориентированное программирование”
Разработать структуру элементов данных класса в виде динамической структуры данных (динамический массив, список, массив указателей)....
Объектно-ориентированное программирование учебное пособие iconУчебное пособие Уфа 2006 удк 519. 8 Б 19 ббк 22. 1: 22. 18 (Я7)
Бакусова С. М. Математика. Часть Математическое программирование / Учебное пособие. Уфа: ООО полиграфстудия «Оптима», 2006. – 71...
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org