Слайд 1Программирование
на ЭВМ
Лекция 9. Основы объектно-ориентированного программирования
Доцент, к. т. н.
Исаев А. В.
avisz@yandex.ru
Ауд. 7 или 234
Слайд 2Абстрактные типы данных
Понятие абстрактных типов данных является ключевым в
программировании. Абстракция подразумевает разделение и независимое рассмотрение интерфейса и реализации.
Пример: телевизор. Можно представить сам телевизор как объект, а средство управления (пульт) — интерфейс с пользователем. Чем совершеннее интерфейс, тем удобнее телевизор в использовании. Пользователь объекта не обязан знать о процессах, происходящих внутри него, и вообще о его устройстве — об этом знают специалисты.
Другими словами, пользователь объекта (т. е. программист) обращается к свойствам объекта (программного модуля), которыми являются интерфейс и реализация.
Основная идея абстракции в программировании как раз и заключается в отделении интерфейса от реализации.
Слайд 3Абстрактные типы данных
По аналогии с примером телевизора: вмешательство неквалифицированного
человека в устройство объекта (попытка починить его своими силами) практически
наверняка приведет к отрицательному результату. Поэтому подобные действия надо запрещать.
В программировании это поддерживается механизмами запрета доступа или скрытия внутренних компонентов. Каждому объекту (модулю) предоставлено право самому распоряжаться «своим имуществом», т. е. данными функциями и операциями. Игнорирование этого принципа нарушает стабильность системы и часто приводит к ее полному разрушению.
Принцип абстракции обязывает использовать механизмы скрытия, которые предотвращают умышленное или случайное изменение внутренних компонентов.
Слайд 4Абстрактные типы данных
Абстракция данных предполагает определение и рассмотрение абстрактных типов
данных или, что то же самое, новых типов данных, введенных
пользователем .
Абстрактный тип данных — это совокупность данных вместе с множеством операций, которые можно выполнять над этими данными .
Слайд 5Характеристики объектов
Можно сказать, что реальные объекты окружающего мира обладают тремя
базовыми характеристиками:
Имеют набор свойств,
Способны разными методами изменять эти
свойства,
Реагировать на события, возникающие как в окружающем мире, так и внутри самого объекта.
Именно в таком виде в языках программирования и реализовано понятие объекта, как совокупности свойств (структур данных, характерных для этого объекта), методов их обработки (подпрограмм изменения свойств) и событий, на которые данный объект может реагировать и которые приводят, как правило, к изменению свойств объекта.
Слайд 6Базовые элементы объектно-ориентированной программы
Базовыми элементами объектно-ориентированной программы являются объекты и
классы.
Слайд 7Объекты
Объект — это часть окружающей нас реальности, т. е. он
существует во времени и в пространстве (впервые понятие объекта в
программировании введено в языке Simula ).
Объект можно представить как что-то ощущаемое или воображаемое и имеющее хорошо определенное поведение. Таким образом, объект можно либо увидеть, либо потрогать, либо, по крайней мере, знать, что он есть — например, представлен в виде информации, хранимой в памяти компьютера.
«Объект – осязаемая сущность, которая четко проявляет свое поведение» (Гради Буч)
Слайд 8Классы. Экземпляры класса
Класс — это множество объектов, имеющих общую структуру
и общее поведение.
Класс — описание (абстракция), которое показывает, как
построить существующую во времени и пространстве переменную этого класса, называемую объектом. Смысл предложений «описание переменных класса» и «описание объектов класса» один и тот же.
Объекты могут иметь идентичную структуру и отличаться только значениями свойств. В таких случаях в программе создается новый тип, основанный на единой структуре объекта. Он называется классом, а каждый конкретный объект, имеющий структуру этого класса, называется экземпляром класса.
Слайд 9Другими словами
Объект — это сущность, которая имеет состояние, поведение
и имя (средство однозначной идентификации).
Структура и поведение объектов описаны
в классах, переменными которых они являются .
Слайд 10Состояние, поведение и идентификация объекта
Состояние объекта объединяет все его поля
данных (статический компонент, т. е. неизменный) и текущие значения каждого
из этих полей (динамический компонент, т. е. изменяющийся).
Поведение выражает динамику изменения состояний объекта и его реакцию на поступающие сообщения, т.е. как объект изменяет свои состояния и взаимодействует с другими объектами.
Идентификация (распознавание) объекта — это свойство, которое позволяет отличить объект от других объектов того же или других классов. Осуществляется идентификация посредством уникального имени, которым наделяется объект в программе, как и любая другая переменная.
Слайд 11Сообщения
Ранее уже говорилось, что процедурный (а также и модульный) подход
позволяет строить программы, состоящие из набора процедур (подпрограмм), реализующих заданные
алгоритмы.
С другой стороны, объектно-ориентированный подход представляет программы в виде набора объектов, взаимодействующих между собой. Взаимодействие объектов осуществляется через сообщения.
Предположим, что объектом является окружность. Тогда сообщение, посланное этому объекту, может быть следующим: «нарисуй себя». Когда мы говорим, что объекту передается сообщение, то на самом деле мы вызываем некоторую функцию этого объекта. В данном примере мы вызовем функцию, которая будет рисовать окружность на экране дисплея.
Слайд 12Объектно-ориентированная методология
Объектно-ориентированная методология так же, как и структурная методология, была
создана с целью дисциплинировать процесс разработки больших программных комплексов и
тем самым снизить их сложность и стоимость.
Объектно-ориентированная методология преследует те же цели, что и структурная, но решает их с другой отправной точки и в большинстве случаев позволяет управлять более сложными проектами, чем структурная методология.
Слайд 13Базовые понятия ООП
Объект – совокупность свойств (параметров) определенных сущностей и
методов их обработки (программных средств). Объект содержит инструкции (программный код),
определяющий действия, которые может выполнять объект, и обрабатываемые данные;
Свойство объекта — характеристика объекта, его параметр;
Метод обработки — программа действий над объектом или его свойствами;
Событие — изменение состояния объекта;
Класс объектов — совокупность объектов, характеризующихся общностью применяемых методов обработки или свойств.
Слайд 14Базовые понятия ООП
Можно дать обобщающее определение: объект ООП— это совокупность
переменных состояния и связанных с ними методов (операций). Методы определяют,
как объект взаимодействует с окружающим миром.
Под методами объекта понимают процедуры и функции, объявление которых включено в описание объекта и которые выполняют действия.
Возможность управлять состояниями объекта посредством вызова методов в итоге и определяет поведение объекта.
Совокупность методов часто называют интерфейсом объекта.
Слайд 15ООП — это моделирование объектов посредством иерархически связанных классов. Малозначащие
детали объекта скрыты от нас, и если мы даем команду,
например, переместить объект, то он «знает», как он это делает.
Переход от традиционного программирования к ООП на начальном этапе характерен тем, что под объектами в программе подразумеваются конкретные физические объекты. В этом случае легче дается понимание различных действий над ними.
В качестве примера можно выбрать простые графические фигуры, поскольку каждая фигура представляет реальный объект на экране. Его всегда можно отобразить и тем самым проверить моделируемые действия над объектом в явном виде. После того как определены простейшие графические объекты, достаточно легко можно формировать более сложные на основе уже имеющихся.
В ООП такому сложному графическому объекту соответствует список примитивных объектов, к которому применимы все те же действия, что и к составляющим его элементам: отображение, стирание с экрана, перемещение в заданном направлении, поворот, масштабирование и т. д.
Слайд 16Три основополагающие концепции ООП
Наследование;
Полиморфизм;
Инкапсуляция (пакетирование).
Слайд 17Наследование
Важнейшая характеристика класса — возможность создания на его основе новых
классов с наследованием всех его свойств и методов и добавлением
собственных.
Класс, не имеющий предшественника, называется базовым.
Наследование позволяет создавать новые классы, повторно используя уже готовый исходный код и не тратя времени на его переписывание.
Слайд 18Наследование
Таким образом, наследование – это процесс, посредством которого один объект
может приобретать свойства другого. Точнее, объект может наследовать основные свойства
другого объекта и добавлять к ним черты, характерные только для него.
Наследование позволяет поддерживать концепцию иерархии классов.
Например, представим себе описание жилого дома. Дом – это часть общего класса, называемого строением. С другой стороны, строение – это часть более общего класса – конструкции, который является частью ещё более общего класса объектов, который можно назвать созданием рук человека. В каждом случае порождённый класс наследует все, связанные с родителем, качества и добавляет к ним свои собственные определяющие характеристики.
Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы исчерпывающи его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным.
Слайд 19Наследование
Каждый потомок несет в себе характеристики своего предка (содержит те
же данные и методы), а также обладает собственными характеристиками. При
этом наследуемые данные и методы описывать у потомка нет необходимости.
В качестве такой иерархии можно рассмотреть точку на экране дисплея, задаваемую своими координатами (предок), отрезок, задаваемый координатами двух точек — его концов (потомок точки), перемещаемый отрезок, задаваемый координатами своих концов и процедурой, обеспечивающей его перемещение (потомок неперемещаемого отрезка) и т. д.
Слайд 20Наследование
Классы могут быть связаны друг с другом различными отношениями. Одним
из основных таких отношений является отношение класс – подкласс, известный
в объектно-ориентированном программировании как наследование.
Например, класс автомобилей Audi 6 является подклассом легковых автомобилей, который в свою очередь входит в более крупный класс автомобилей, а последний является подклассом класса транспортных средств, который помимо автомобилей включает в себя самолеты, корабли поезда и т. д.
Примером подобных отношений, являются системы классификации в ботанике и зоологии. Отношением, обратным наследованию, является обобщение или генерализация. Она указывает, что некий класс, является более общим (обобщенным) классом другого класса. Класс транспортных средств, к примеру, является генерализацией классов автомобилей, самолетов и кораблей.
Слайд 21Наследование
И структурная, и объектно-ориентированная методологии преследуют цель построения иерархического дерева
взаимосвязей между объектами (подзадачами).
Но если структурная иерархия строится по
простому принципу разделения целого на составные части, то при создании объектно-ориентированной иерархии непременно отражается наследование свойств родительских (вышележащих) типов объектов дочерним (нижележащим) типам объектов.
структурная иерархия
объектно-ориентированная иерархия
Слайд 22Наследование
По Гради Бучу, «наследование — это такое отношение между объектами,
когда один объект повторяет структуру и поведение другого».
Принцип наследования
действует в жизни повсеместно и повседневно. Млекопитающие и птицы наследуют признаки живых организмов, в отличие от растений; орел и ворон наследуют общее свойство для птиц – умение летать. С другой стороны, львы, тигры, леопарды наследуют «структуру» и поведение, характерное для представителей отряда кошачьих и т.д.
Типы верхних уровней объектно-ориентированной иерархии, как правило, не имеют конкретных экземпляров объектов. Не существует, например, конкретного живого организма, который бы сам по себе назывался «млекопитающее» или «птица». Такие типы называют абстрактными, как уже говорилось ранее.
Слайд 23Наследование
Наследование позволяет использовать библиотеки классов и развивать их (совершенствовать и
модифицировать) в конкретной программе.
Наследование позволяет создавать новые объекты, изменяя
или дополняя свойства прежних. Объект-наследник получает все поля и методы предка, но может добавить собственные поля, добавить собственные методы или перекрыть своими методами одноименные унаследованные методы.
Принцип наследования решает проблему модификации свойств объекта и придает ООП в целом исключительную гибкость. При работе с объектами программист обычно подбирает объект, наиболее близкий по своим свойствам для решения конкретной задачи, и создает одного или нескольких потомков от него, которые «умеют» делать то, что не реализовано в родителе.
Последовательное проведение в жизнь принципа «наследуй и изменяй» хорошо согласуется с поэтапным подходом к разработке крупных программных проектов и во многом стимулирует такой подход.
Слайд 24Типы можно выстроить в иерархию. Объект может наследовать компоненты из
другого объектного типа. Наследующий объект — это потомок. Объект, которому
наследуют — предок.
Важно: наследование относится только к типам, но не к экземплярам объектов.
Если введен объектный тип (предок, родительский), а его надо дополнить полями или методами, то вводится новый тип, объявляется наследником (потомком, дочерним типом) первого и описываются только новые поля и методы. Потомок содержит все поля типа предка.
Поля и методы предка доступны потомку без специальных указаний. Если в описании потомка повторяются имена полей или методов предка, то новые описания переопределяют поля и методы предка.
Слайд 25Наследование
ООП всегда начинается с базового класса. Это шаблон для базового
объекта. Следующим этапом является определение нового класса, который называется производным
и является расширением базового.
Производный класс может включать дополнительные методы, которые не существуют в базовом классе. Он может переопределять методы или даже удалять их целиком.
В производном классе не должны переопределяться все методы базового класса. Каждый новый объект наследует свойства базового класса, необходимо лишь определить те методы, которые являются новыми или были изменены. Все другие методы базового класса считаются частью и производного. Это удобно, т. к. когда метод изменяется в базовом классе, он автоматически изменяется во всех производных классах.
Слайд 26Наследование
Процесс наследования может быть продолжен. Класс, который произведен от базового,
может сам стать базовым для других производных классов. Таким образом,
ОО программы создают иерархию классов.
Слайд 27Полиморфизм
Полиморфизм (от греч. πολὺ- — много, и μορφή — форма):
– это свойство, которое позволяет одно и то же имя
использовать для решения двух или более схожих, но технически разных задач.
Полиморфизм выражается в том, что под одним именем скрываются различные действия, содержание которых зависит от типа объекта.
Целью полиморфизма, применительно к объектно-ориентированному программированию, является использование одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных.
Слайд 28Полиморфизм
При наследовании одни методы класса могут замещаться другими. Так, класс
транспортных средств будет обладать обобщенным методом движения. В классах-потомках этот
метод будет конкретизирован: автомобиль будет ездить, самолет – летать, корабль – плавать. Такое изменение семантики метода и называется полиморфизмом.
Полиморфизм – это выполнение методом с одним и тем же именем различных действий в зависимости от контекста, в частности, от принадлежности тому или другому классу.
Слайд 29Пример
Полиморфизм означает что для различных родственных объектов можно задать единый
класс действий (например, перемещение по экрану любой геометрической фигуры). Затем
для каждого конкретного объекта составляется своя подпрограмма, выполняющая это действие непосредственно для данного объекта (естественно, что перемещение по экрану точки отличается от перемещения отрезка, а перемещение отрезка, в свою очередь, отличается от перемещения многоугольника и т. д.), причем все эти подпрограммы могут иметь одно и то же имя. Когда потребуется перемещать конкретную фигуру, будет выбрана из всего класса соответствующая подпрограмма.
Слайд 30Другой пример
Полиморфизм – это свойство родственных объектов (т.е. объектов, имеющих
одного общего родителя) решать схожие по смыслу проблемы разными способами.
Например, действие «бежать» свойственно большинству животных. Однако каждое из них (лев, слон, крокодил, черепаха) выполняет это действие различным образом.
При традиционном (не объектно-ориентированном) подходе к программированию, животных перемещать будет программист, вызывая отдельную для конкретного животного и конкретного действия подпрограмму.
Таким образом, в нашем примере с объектами-животными действие «бежать» будет называться полиморфическим действием, а многообразие форм проявления этого действия – полиморфизмом.
Слайд 31Полиморфизм
В рамках ООП поведенческие свойства объекта определяются набором входящих в
него методов, программист только указывает, какому объекту какое из присущих
ему действий требуется выполнить, и (для рассматриваемого примера) однажды описанные объекты-животные сами будут себя передвигать характерным для них способом, используя входящие в его состав методы.
Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства.
Для изменения метода необходимо перекрыть его в потомке, т. е. объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющих разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов.
Слайд 32Полиморфизм
Преимуществом полиморфизма является то, что он помогает снижать сложность программ,
разрешая использование того же интерфейса для задания единого класса действий.
Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор.
Слайд 33Инкапсуляция
Инкапсуляция (пакетирование) предполагает соединение в одном объекте данных и функций/процедур,
которые манипулируют этими данными. Доступ к некоторым данным внутри объекта
может быть либо запрещен, либо ограничен.
Объект характеризуется как совокупностью всех своих свойств (например, для животных – это наличие головы, ушей, глаз и т.д.) и их текущих значений (голова – большая, уши – длинные, глаза – желтые и т.д.), так и совокупностью допустимых для этого объекта действий (умение принимать пищу, сидеть, стоять, бежать и т.д.). Указанное объединение в едином объекте как «материальных» составных частей (голова, уши, хвост, лапы), так и действий, манипулирующих этими частями (действие «бежать» быстро перемещает лапы) называется инкапсуляцией.
Слайд 34Инкапсуляция
Инкапсуляция (пакетирование) – это механизм, который объединяет данные и код,
манипулирующий этими данными, а также защищает и то, и другое
от внешнего вмешательства или неправильного использования.
В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый «чёрный ящик». Когда коды и данные объединяются таким способом, создаётся объект.
Другими словами, объект – это то, что поддерживает инкапсуляцию. Внутри объекта коды и данные могут быть закрытыми. Закрытые коды или данные доступны только для других частей этого объекта.
Примером может служить перемещаемый по экрану отрезок, определяемый координатами своих концов (данные), и процедурой, обеспечивающей это перемещение (метод).
Слайд 35Инкапсуляция
В рамках ООП, как уже говорилось, данные называются полями объекта,
а алгоритмы – объектными методами.
Инкапсуляция позволяет в максимальной степени
изолировать объект от внешнего окружения. Она существенно повышает надежность разрабатываемых программ, т. к. локализованные в объекте алгоритмы обмениваются с программой сравнительно небольшими объемами данных, причем количество и тип этих данных обычно тщательно контролируется. В результате замена или модификация алгоритмов и данных, инкапсулированных в объект, как правило, не влечет за собой плохо прослеживаемых последствий для программы в целом.
Другим немаловажным следствием инкапсуляции является легкость обмена объектами, переноса их из одной программы в другую.
Слайд 36Инкапсуляция
Помимо атрибутов (т. е. свойств) объекты обладают некоторыми функциональными возможностями,
которые в объектно-ориентированном программировании (ООП) называют операциями или методами. Так
автомобиль может ездить, корабль – плавать, компьютер – производить вычисления.
Таким образом, объект инкапсулирует атрибуты и методы, скрывая от других объектов взаимодействующих с ним и использующих его функциональность, свою реализацию. Так для того чтобы переключить телевизионную программу нам достаточно на пульте дистанционного управления набрать ее номер, что запустит сложный механизм, который в итоге и приведет к желаемому результату. Нам совершенно не обязательно знать, что происходит в пульте дистанционного управления и телевизоре, нам лишь достаточно знать, что телевизор обладает такой возможностью (методом) и как ее можно активировать. Инкапсуляция или сокрытие реализации является базовым свойством ООП. Она позволяет создавать пользовательские объекты, обладающие требуемыми методами и далее оперировать ими, не вдаваясь в устройство этих объектов.
Слайд 37Инкапсуляция
Инкапсуляция скрывает детали реализации объекта.
Слайд 38Преимущества ООП
ООП обладает рядом преимуществ при создании больших программ, в
частности:
использование более естественных с точки зрения повседневной практики понятий,
простота введения новых понятий;
некоторое сокращение размера программ за счет того, что повторяющиеся (наследуемые) свойства и действия можно не описывать многократно, как это делается при использовании подпрограмм; кроме того, использование динамических объектов позволяет более эффективно использовать оперативную память;
возможность создания библиотеки объектов;
сравнительно простая возможность внесения изменений в программу без изменения уже написанных частей, а в ряде случаев и без перекомпиляции этих написанных и уже скомпилированных частей, используя свойства наследования и полиморфизма;
возможность написания подпрограмм с различными наборами формальных параметров, но имеющих одно и то же имя, используя свойство полиморфизма;
более четкая локализация свойств и поведения объекта в одном месте (используется свойство инкапсуляции), позволяющая проще разбираться со структурой программы, отлаживать ее, находить ошибки;
возможность разделения доступа к различным объектам программы и т. д.
Слайд 39Недостатки ООП
Однако следует иметь в виду, что ООП обладает и
рядом недостатков и эффективно не во всех случаях. Как правило,
использование ООП приводит к уменьшению быстродействия программы, особенно в тех случаях, когда используются т. н. виртуальные методы.
Неэффективно ООП применительно к небольшим программам, поэтому его можно рекомендовать при создании больших программ, а лучше даже класса программ.
Можно, по-видимому, даже сказать, что ООП скорее не упрощает саму программу, а упрощает технологию ее создания.
Слайд 40Реализация объекта в Pascal
В Паскале объект очень похож на запись,
которая является соединением нескольких взаимосвязанных элементов данных под одним именем.
Тип и характер данных определяют свойства объекта.
С другой стороны, объект имеет свое поведение, определяемое процедурами и функциями этого объекта.
Слайд 41Описание объектного типа
Класс или объект – это структура данных, которая
содержит поля и методы. Как всякая структура данных она начинается
зарезервированным словом и закрывается оператором end.
Формальный синтаксис не сложен:
Type <имя типа объекта>= object
<поле>;
<поле>;
…
<метод>;
<метод>;
end;
Слайд 42Описание объектного типа
(2-й способ)
В Pascal существует специальное зарезервированное слово
class для описания объектов, заимствованное из С++.
Type
типа объекта>= class
<поле>;
….
<метод>;
<метод>;
end;
Современные реализации Pascal поддерживают обе модели описания объектов.
Слайд 43Поля объектов есть полная аналогия с записями полей. Методы –
процедуры и функции, обрабатывающие поля объектов. Пример:
type
Car = object
Color: string;
Volume:
real;
Smax: real;
Procedure Start;
Procedure Stop;
End;
Слайд 44Названия объектов начинаются с заглавной буквы, что соответствует соглашению языка
Pascal. Далее объявляется переменная указанного типа:
Var
Citroen: Car;
Обращение к полям и
методам аналогична обращению к полям записи:
Citroen.Color:= ‘Black’;
Citroen.Volume:= 1.6;
Citroen.Start;
Citroen.Stop;
Слайд 45Динамическое создание объекта:
Var
Citroen: ^Car;
Begin
New (Citroen);
Citroen^.Color:= ‘Black’;
Citroen^.Start;
Citroen^.Stop;
End;
Слайд 46Как упоминалось, производный тип наследует все свойства родительского типа. Для
создания производных типов используется следующая конструкция:
Type
Sedan = object(Car)
…
End;
Слайд 47В языке Pascal, допускается обратная совместимость объектных типов. Например, если
объявлена процедура WriteInfo(c: car), то в нее можно передать переменную
типа Sedan или Car. Если объявлена процедура WriteInfo (c: Sedan), то в нее может быть передана переменная типа Sedan, или переменная производная от него.
Слайд 48Примеры реализации методов
Реализация объекта происходит вне объявления объекта. В объекте
находится лишь «проекция» переменной. Например:
Type Car = class
Fuel, doors: longint;
Color:
string;
procedure newcolor (s: string);
end;
procedure Car.newcolor(s: string);
begin
color:= s;
end;
Var
c: car;
begin
c.newcolor ('Белый');
end.
Слайд 49В производных типах можно переопределять методы, унаследованные от родительского типа.
Переопределять – значит использовать метод с одним и тем же
названием, но с различной реализацией.
Procedure Car.newcolor (s: string);
Procedure Sedan.newcolor (s: string);
Все методы в вышеописанных примерах называются статическими. Это означает, если в производном типе не переопределен метод, то он будет работать с данными родительского типа.
При вызове не переопределённого статического метода на самом деле вызывается метод, который может не иметь доступа к некоторым данным вызывающего объекта, т.к. ссылки на статические методы определяются во время компиляции программы, и компилятор относит их к определенному типу.
Решением этой проблемы является использование виртуальных методов, ссылки на которые определяются во время выполнения программы, благодаря чему метод сопоставляется именно с типом вызывающего объекта.
Procedure Start: virtual;