Автор работы: Пользователь скрыл имя, 15 Апреля 2014 в 11:33, реферат
В этом состоит главное отличие объектно-ориентированного программирования от процедурного программирования, где отдельно определённые структуры данных передаются в процедуры (функции) в качестве параметров. Таким образом, объектно-ориентированная программа состоит из объектов – отдельных фрагментов кода, обрабатывающего данные, которые взаимодействуют друг с другом через определённые интерфейсы.
ВВЕДЕНИЕ………………………………………...………………....…….3
Глава 1. История объектно-ориентированного программирования……4
Глава 2. Объекты в объектно-ориентированном программировании….9
Глава 3. Инкапсуляция в объектно-ориентированном программировании………………………………………………………………11
Глава 4. Наследование и виртуальные методы………………………....12
Глава 5. Динамическое создание объектов и полиморфизм………………………………………………………….…………16
ЗАКЛЮЧЕНИЕ ………………………………………………………..…18
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ ………………….……...20
Инкапсуляция и является средством организации доступа к данным только через соответствующие методы.
Если в программе имеется описание нескольких переменных указанного типа, то для каждой переменной резервируется своя собственная область памяти для хранения данных, а указатели на точки входа в процедуру и функции – общие. Вызов каждого метода возможен только с помощью составного имени, явно указывающего, для обработки каких данных предназначен данный метод.
Глава 4. Наследование и виртуальные методы
Наследование – это ещё одно базовое понятие объектно-ориентированного программирования. Наследование позволяет определять новые объекты, используя свойства прежних, дополняя или изменяя их. Объект-наследник получает все поля и методы «родителя», к которым он может добавить свои собственные поля и методы или заменить («перекрыть») их своими методами.
Пример описания объекта-наследника даётся ниже:
Tipe
Point =bject(Location)
Visible: Boolean;
Procedure Int(IntX, IntY: Integer);
Procedure Show;
Procedure Hide;
Function IsVisible: Boolean;
Procedure MoveTo(NewX, NewY: Integer);
End;
Наследником здесь является объект Point, описывающий графическую точку, а родителем – объект Location. Наследник не содержит описание полей и методов родителя. Имя последнего указывается в круглых скобках после слова object. Из методов наследника можно вызывать методы родителя. Для создания наследника не требуется иметь исходный текст объекта родителя.
Объект-родитель может быть уже в составе оттранслированного модуля.
В чём привлекательность наследования? Если некий объект был уже определён и отлажен, он может быть использован и в других программах. При этом может оказаться, что новая задача отличается от предыдущей, и возникает необходимость некоторой модификации как данных, так и методов их обработки. Программисту приходится решать дилемму – создания объектов заново или использовать результаты предыдущей работы, применяя механизм наследования. Первый путь менее эффективен, так как требует дополнительных затрат времени на отладку и тестирование. Во втором случае часть этой работы оказывается выполненной, что сокращает время на разработку новой программы. Программист при этом может и не знать деталей реализации объекта-родителя.
В нашем примере к объекту, связанному с определением положения графического элемента, просто добавилось новое поле, описывающее признак видимости графической точки, и несколько новых методов, связанных с режимом отображения точки и её преобразованиями.
Наследование позволяет создавать иерархические, связанные отношениями подчинения, структуры данных. Следует, однако, заметить, что при использовании этой возможности могут возникнуть проблемы. Предположим, что в нашей графической программе необходимо определить объект Circle, который является потомком другого объекта Point:
Type
Circle =bject (point)
Radius: Integer;
Procedure Show;
Procedure Hide;
Procedure Expand(ExpandBy: Integer);
Procedure Contact(ContactBy: Integer);
End;
Новый объект Circle соответствует окружности. Поскольку свойства окружности отличаются от свойств точки, в объекте-наследнике придется изменять процедуры Show и Hide, которые отображают окружность и удаляют её изображение с экрана. Может оказаться, что метод Init объекта Circle, унаследованный от объекта Point, также использует методы Show и Hide, впредь во время трансляции объекта Point использует ссылки на старые методы. Очевидно в объекте Circle они работать не будут.
Можно, конечно, попытаться «перекрыть» метод Init. Чтобы это сделать, нам придётся полностью воспроизвести текст метода. Это усложнит работу, да и не всегда возможно, поскольку исходного текста программы может не оказаться под рукой (если объект-родитель уже находиться в оттранслированном модуле).
Для решения этой проблемы используется виртуальный метод. Связь между виртуальным методом и вызывающими их процедурами устанавливается не во время трансляции (это называется ранним связанием), а во время выполнения программы (позднее связание).
Чтобы использовать виртуальный метод, необходимо в описании объекта после заголовка метода добавить ключевое слово virtual. Заголовки виртуальных методов родителя и наследника должны в точности совпадать.
Инициализация экземпляра объекта, имеющего виртуальные методы, должна выполняться с помощью специального метода – конструктора. Конструктор обычно присваивает полям объекта начальные значения и выполняет другие действия по инициализации объекта. В заголовке метода-конструктора слово procedure заменяется словом constructor. Действия обратные действиям конструктора, выполняет ещё один специальный метод – деструктор. Он описывается словом destructor.
Конструктор выполняет действия по подготовке позднего связывания. Эти действия заключаются в создании указателя на таблицу виртуальных методов, которая в дальнейшем используется для поиска методов. Таблица содержит адреса всех виртуальных методов. При вызове виртуального метода по его имени определяется адрес, а затем по этому адресу передается управление.
У каждого объектного типа имеется своя собственная таблица виртуальных методов, что позволяет одному и тому же оператору вызывать разные процедуры. Если имеется несколько экземпляров объектов одного типа, то недостаточно вызвать конструктор для одного из них, а затем просто скопировать этот экземпляр во все остальные. Каждый объект должен иметь свой собственный конструктор, который вызывается для каждого экземпляра. В противном случае возможен сбой в работе программы.
Заметим, что конструктор или деструктор, могут быть «пустыми», то есть не содержать операторов. Весь необходимый код в этом случае создается при трансляции ключевых слов construct и destruct.
В данной главе рассмотрены наследование и виртуальные методы в объектно-ориентированном программировании.
Глава 5. Динамическое создание объектов и полиморфизм
Переменные объектного типа могут быть динамическими, то есть размещаться в памяти только во время их использования. Для работы с динамическими объектами используются расширенный синтаксис процедур New и Dispose. Обе процедуры в этом случае содержат в качестве второго параметра вызов конструктора или деструктора для выделения или освобождения памяти переменной объектного типа:
New(P, Construct)
или
Dispose(P, Destruct).
Где P – указатель на переменную объектного типа, а Construct или Destruct – конструктор и деструктор этого типа.
Действие процедуры New в случае расширенного синтаксиса равносильно действию следующей пары операторов:
New(P);
P^Construct;
Эквивалентом Dispose является следующее:
P^Dispose;
Dispose(P)
Применение расширенного синтаксиса не только улучшает читаемость исходного кода, но и генерирует более короткий и эффективный исполняемый код.
Полиморфизм заключается в том, что одно и то же имя может соответствовать различным действиям в зависимости от типа объекта. В тех примерах, которые рассматривались ранее, полиморфизм проявлялся в том, что метод Init действовал по-разному в зависимости от того, является объект точкой или окружностью. Полиморфизм напрямую связан с механизмом позднего связывания. Решение о том, какая операция должна быть выполнена в конкретной ситуации, принимается во время выполнения программы.
Рассмотрим вопрос о совместимости объектных типов. Наследник сохраняет свойства совместимости с другими объектами своего родителя. В правой части оператора присваивания вместо типов родителя можно использовать типы наследника, но не наоборот. Дело в том, что наследник может быть более сложным объектом, содержащим поля и методы, поэтому присваиваемые значения экземпляра объекта-родителя экземпляру объекта-наследника может оставить некоторые поля неопределёнными и, следовательно, представляет потенциальную опасность. При выполнении оператора присвоения копируются только те поля данных, которые являются общими для обоих типов.
Указателю на экземпляр объектного типа может быть присвоен адрес любого экземпляра любого из дочерних типов. При обращении к свойствам и методам через этот указатель будет доступен именно экземпляр, адрес которого был присвоен, а не предок. Это и есть полиморфизм. Т.е. Вы можете иметь доступ к потомку через указатель объектного типа предка.
В данной главе рассмотрены понятия объектно-ориентированного программирования, такие как динамическое создание объектов и полиморфизм.
Заключение
Объект в объектно-ориентированном программировании можно сравнивать с «черным ящиком». Мы можем инициализировать объект, или он сам инициализируется значениями по умолчанию, вызвать нужный метод объекта, и получить результат. Нас мало интересует то, что в нем конкретно происходит, если объект уже достаточно хорошо отлажен. Основная идея объектно-ориентированного подхода заключается в наличие интерфейса, который служит для полиморфного обращения с объектом и его потомками. За счет наличия интерфейса легко достигается повторное использование кода. Многие программисты, переходящие от процедурного программирования к объектно-ориентированному программированию справедливо замечают, что они могут сделать все то же самое и без использования объектов. Объектно-ориентированное программирование - это всего лишь соглашение о правилах построения программ. Вся мощь объектной ориентации раскрывается в крупных проектах, или при написании большого количества однотипных программ, например программ, работающих с базами данных. За счет повторного использования кода достигается простота в работе программиста (накопление опыта), сокращается размер программы (методы объектов одного типа или методы, наследуемые от предков потомками существуют в единственном экземпляре), а значит и больше простоты при отладке (объекты описываются в определенном месте программы отдельно от реализации), простота сопровождения программы (не меняя интерфейс объекта, Вы можете изменить реализацию методов) и т.д. Но, это только в идеале. Все зависит от правильности и лаконичности дерева наследования объектов.
Мы уже привыкли использовать в своих программах процедуры и функции для программирования тех сложных действий по обработке данных, которые приходится выполнять многократно. Использование подпрограмм в своё время было важным шагом на пути к увеличению эффективности программирования.
Подпрограмма может иметь формальные предметы, которые при обращении к ней заменяются фактическими предметами. В этом случае есть опасность вызова подпрограммы с неправильными данными, что может привести к сбою программы и её аварийному завершению при выполнении. Поэтому естественным обобщением традиционного подхода к программированию является объединение данных и подпрограмм (процедур и функций), предназначенных для их обработки.
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
1. Бадд Т. Объектно-ориентированное программирование в действии / Т. Бадд. — СПб.: Питер, 1997. — 464с.
2. Банников Н.А. Объектно-ориентированный подход к программированию / Н.А. Банников. — М.: Поспект, 2010. — 269с.
3. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++ / Пер. И.Романовский, Ф.Андреев. — 2-е изд. — М.: СПб.: Бином, Невский диалект, 1998. — 560с.
4. Синтес А. Освой самостоятельно объектно-ориентированное программирование за 21 день / А. Синтес. — М.: Вильямс, 2002. — 672с.
Информация о работе Объектно-ориентированное программирование