Автор работы: Пользователь скрыл имя, 16 Сентября 2009 в 13:41, Не определен
Учебник по программированию
ОСНОВНЫЕ
ПРИНЦИПЫ ООП
Руководящая идея объектно-ориентированного программирования (ООП) заключается в стремлении связать данные с обрабатывающими эти данные процедурами в единое целое - объект.
Характерной чертой объектов является инкапсуляция (объединение) данных и алгоритмов их обработки, в результате чего и данные, и процедуры во многом теряют самостоятельное значение.
Фактически объектно-ориентированное программирование можно рассматривать как модульное программирование нового уровня, когда вместо во многом случайного, механического, объединения процедур и данных акцент делается на их смысловую связь.
Какими
мощными средствами располагает
объектно-ориентированное
Объектно-ориентированное программирование основано на «трех китах» - трех важнейших принципах, придающих объектам новые свойства.
Этими принципами являются инкапсуляция, наследование и полиморфизм.
Инкапсуляция - есть объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются полями объекта, а алгоритмы - объектными методами.
Инкапсуляция позволяет в максимальной степени изолировать объект от внешнего окружения.
Она существенно повышает надежность разрабатываемых программ, т.к. локализованные в объекте алгоритмы обмениваются с программой сравнительно небольшими объемами данных, причем количество и тип этих данных обычно тщательно контролируются. В результате замена или модификация алгоритмов и данных, инкапсулированных в объект, как правило, не влечет за собой плохо прослеживаемых последствий для программы в целом (в целях повышения защищенности программ в ООП почти не используются глобальные переменные).
Другим
немаловажным следствием инкапсуляции
является легкость обмена объектами, переноса
их из одной программы в другую. Можно
сказать, что ООП «провоцирует» разработку
библиотек объектов, таких как Turbo
Vision.
Наследование
Наследование есть свойство объектов порождать своих потомков.
Объект-потомок автоматически наследует от родителя все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.
Принцип наследования решает проблему модификации свойств объекта и придает ООП в целом исключительную гибкость. При работе с объектами программист обычно подбирает объект, наиболее близкий по своим свойствам для решения конкретной задачи, и создает одного или нескольких потомков от него, которые «умеют» делать то, что не реализовано в родителе.
Последовательное проведение в жизнь принципа «наследуй и изменяй» хорошо согласуется с поэтапным подходом к разработке крупных программных проектов и во многом стимулирует такой подход.
Полиморфизм - это свойство родственных объектов (т.е. объектов, имеющих одного общего родителя) решать схожие по смыслу проблемы разными способами.
В рамках ООП поведенческие свойства объекта определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть его в потомке, т.е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов.
(на примере двух работающих модулей и тексте программы)
Обработанный
материал из учебного
пособия Фаронов
В.В. “Turbo Pascal 7.0” Учебное
пособие. Начальный
курс. Нолидж. Москва. 2001
г. (с.179-194)
Программа создает на экране ряд графических изображений (точки, окружность, линия, квадрат) и может перемещать эти изображения по экрану.
Вид
создаваемого программой экрана.
Для
перемещения изображений в
Техническая реализация программы требует использования средств двух стандартных библиотек - CRT и GRAPH.
Для решения задачи создадим два модуля GraphObj и GraphApp.
В Модуле GraphObj описываются все используемые объекты. Модуль компилируется в библиотечный файл GraphObj.tpu.
Основная
программа будет использовать модуль
GraphObj с описанием объектов.(Далее текст
рабочего модуля. Файл: GraphObj.pas. )
Unit GraphObj;
Interface
type
TGraphObj=object {объект – родитель в рамках которого инкапсулированы поля и методы, общие для всех остальных объектов<=Свойство объектов-инкапсуляция }
Private { Поля объекта будут скрыты от пользователя. Объект не может менять координаты реперной точки и цвет фигуры. Описания полей ничем не отличаются от описания обычных переменных.}
x,y:integer; {Координаты реперной точки}
color:word; {Цвет фигуры}
Public {Методы объекта будут доступны пользователю. Директива public отменяет действие директивы private. Для описания методов используются процедуры и функции, конструкторы и деструкторы.}
Constructor Init(aX,aY:integer; aColor:word); { Конструкторы предназначены для создания конкретного экземпляра объекта обращение к конструктору должно предшествовать обращению к любому виртуальному методу. Типичное действие, реализуемое конструктором, состоит в наполнении объектных полей конкретными значениями.}
Procedure
Draw (aColor:word);virtual; {Вычерчивает
объект заданным цветом
aColor В объекте TGraphObj процедура
Draw определена как виртуальная («воображаемая»).
Абстрактный объект TGraphObj не предназначен
для вывода на экран, однако наличие процедуры
Draw в этом объекте говорит о том, что
любой потомок TGraphObj должен иметь собственный
метод Draw, с помощью которого он может
показать себя на экране.
(<=Свойство объектов
– полиморфизм).При
трансляции объекта,
содержащего виртуальные
методы, создается так
называемая таблица
виртуальных методов (ТВМ),
количество элементов
которой равно количеству
виртуальных методов
объекта. В этой таблице
будут храниться адреса
точек входа в каждый
виртуальный метод.
В нашем примере ТВМ
объекта TGraphObj хранит
единственный элемент -
адрес метода Draw.}
Proced
Proced
Proced
В этом методе
сначала с помощью
Hide объект стирается
с экрана, а затем с помощью
Show показывается в другом
месте.}
end; {Конец
описания объекта TGraphObj}
{Далее мы создадим несколько потомков объекта TGraphObj. Каждый из них будет иметь собственный конструктор, с помощью которого ТВМ каждого потомка настраивается так, чтобы ее единственный элемент содержал адрес нужного метода Draw.
Такая процедура называется поздним связыванием объекта.
Позднее
связывание позволяет
методам родителя
обращаться к виртуальным
методам своих потомков
и использовать их для
реализации специфичных
для потомков действий.
(Это опять - полиморфизм)(В
нашем примере она совпадает
с координатами точки
в описываемом ниже
объекте TPoint, с центром
окружности в объекте
TCircle, первым концом
прямой в объекте Liпе
и с левым верхним углом
прямоугольника в объекте
TRect.)}
{Сначала описываются
все объекты (совокупность полей и методов
(данные и процедуры) присущих только данному
объекту), а далее обычно в разделе Implementation
объектного модуля описываются соответствующие
объектам процедуры и функции (т.е. соответствующие
методы (действия над объектами)}
TPoint = object(TGraphObj) {Описание
объекта TPoint. Потомки
объекта TGraphObj: TPoint, TLine,
TCircle наследуют поля
и методы родительского
объекта. TRect – потомок
объекта TLine <=Свойство
объектов – наследование.
}
Procedure Draw (aColor:word);virtual;
end;
TLine= object(TGraphObj)
dx,dy:integer; {Приращения
координат второго конца}
Constructor Init(X1,Y1,X2,Y2:integer; aColor:word); {Инициализируется новый объект TLine который является наследником объекта TGraphObj,но скоро будет «отцом» объекта TRect,а новый обьект будет по прежнему использовать «дедовскую» виртуальную процедуру Draw. По-этому вместо слова Procedure пишем Constructor }
Procedure Draw (aColor:word);virtual;
end;
{Поскольку
вызов MoveTo ,будет происходить
в рамках объекта TLine,
используется ТВМ
этого объекта и вызывается
его метод
Draw, вычерчивающий
прямую. Если бы перемещалась
окружность, ТВМ содержала
бы адрес метода Draw объекта
TCircle и визуализация-стирание
объекта осуществлялась
бы с помощью этого метода.
(Следует выполняется
третье свойство объектов
- полиморфизм)}
TCircle = object(TGraphObj)
r:integer; {вводится новое поле объекта, которое отсутствует у предка - радиус}
Constructor Init(aX,aY,aR:integer; aColor:word);{Перед использованием «виртуальной» процедуры Draw при инициализации нового объекта всегда заменяем слово Procedure на слово Constructor. Так как выводиться на экран будет новый объект. То есть меняем ссылку с указанием параметров вывода предыдущего объекта на новые. В данном случае на следующем шаге Draw выведет на экран – окружность. }
Procedure Draw (aColor:word);virtual;
end;
TRect= object(TLine) {TRect – потомок объекта TLine}
Procedure Draw (aColor:word);virtual;
end;
{Описание
методов (- «телодвижений»
объектов) производится
обычным для Паскаля
способом в любом месте
раздела описаний (обычно
в разделе Implementation
объектного модуля),
но после
описания объекта.}
Implementation
{Исполняемая
часть содержит
описания всех
объектных методов}
Uses Graph;
Constructor TGraphObj.Init; {Инициализируется родительский объект TGraphObj. Далее используется виртуальный метод Draw, по-этому вместо слова Procedure используется слово Constructor }