Итак, основными принципами ОО-технологии программирования являются: абстрагирование, инкапсуляция, наследование, полиморфизм.
Объектно-ориентированное программирование.
Общие принципы.
Цель любой технологии программирования – упростить и ускорить разработку требуемой конечной системы. Поднять средства разработки программного обеспечения на более высокий уровень абстракции, позволяющей программисту избегать рутинных, сложных для понимания конструкций, принципов, методов и средств.
Так самым сложным для понимания, изучения, а также в реализации конечной задачи является язык ассемблера, когда программисту нужно оперировать с регистрами процессора, ячейками памяти и т.д. Когда простейшая операция занимает несколько строк программного кода. Поэтому этот язык является языком низкого уровня. Язык С уже является языком высокого уровня. Он позволяет подняться на несколько ступеней вверх в уровне своего функционала, позволяя программисту более легко и быстро создавать свои программы. Многострочные конструкции из ассемблера здесь могут быть заменены одной, двумя командами. С помощью своего функционала С скрывает от программиста сложность реализации различных программных конструкций. Развивая тенденцию упрощения и ускорения создания сложных программных систем, язык С++ предлагает еще одну технологию, повышающую эффективность работы программиста, - технологию объектно-ориентированного программирования.
Объектно-ориентированное программирование (ООП) - это технология программирования, позволяющая моделировать объекты реального мира с помощью программных аналогов.
Изучение объектно-ориентированной технологии программирования необходимо начать со знакомства с некоторыми ключевыми терминами объектной ориентации.
Всюду вокруг нас реальный мир. Куда бы мы ни бросили взгляд - объекты (люди, растения, автомобили, здания, компьютеры и тому подобное). Человечество думает и живет в терминах объектов. Все объекты реального мира можно было бы разделить на категории, например, оживленные объекты и неоживленные. Оживленные – передвигаются, выполняют какие-то действия. Неоживленные объекты – это своего рода, окружение оживленных объектов. Несмотря на столь существенную разницу между объектами этих категорий, они имеют нечто общее. Объекты имеют атрибуты: размер, цвет, форму, вес и т.п. Они проявляют какое-то поведение: мяч катится, подпрыгивает, скачет и т.д. Человек идет, стоит, радуется, работает, спит и т.д. Автомобиль – разворачивается, тормозит, поворачивает и т.д. Мы узнаем об объектах путем их изучения, наблюдения за ними и выясняем, что разные объекты могут иметь много одинаковых атрибутов и представлять похожие черты поведения: взрослые и дети, люди и шимпанзе, легковые автомобили, грузовики и роликовые коньки. Такие объекты имеют много общего.
Так вот, когда можно выделит объекты, имеющие одинаковые характеристики говорят о классе. Например, класс средств передвижения. Класс содержит данные, которые описывают атрибуты класса (масса, мощность, скорость) и функции (движение вперед, назад, руление), которые реализуют поведение класса. Когда программист описывает класс он фактически вводит новый тип данных. Точно так же, как экземпляр любого встроенного типа (например, int) называется переменной, экземпляр определенного пользователем типа (т.е. класса), называется объектом или экземпляром класса.Класс для объекта, это то же самое, что проект для дома. Можно построить много домов по одному проекту. Аналогично, можно реализовать много объектов из одного класса. Идея классов является основой ООП. Объектно-ориентированная программа строится в терминах объектов и их взаимосвязей.
Вновь создаваемый программистом класс может иметь много характеристик, сходных с характеристиками объектов уже существующего класса (например, класс средства передвижения и класс легковые автомобили). Объектно-ориентированная технология позволяет вновь создаваемому классу приобрести характеристики существующего класса, а также содержать свои собственные уникальные характеристики. Этот механизм или принцип ООП называется наследованием.
Например, объекты класса «кабриолеты» определенно имеют характеристики объектов класса «легковые автомобили», но у первых еще крыша открывается и закрывается. Наследование дает возможность создавать иерархию классов, когда потомки наследуют все свойства своих предков, могут их изменять и добавлять новые. Свойства при наследовании повторно не описываются, что сокращает объем программы.
Дочерний класс может унаследовать структуру и поведение родительских классов.
Фрагмент иерархии классов библиотеки создания элементов интерфейса MFC.
Важным понятием как в технологии ООП, так и просто при решении сложных задач, является понятие абстракции. Абстрагирование проявляется в нахождении сходств между определенными объектами, ситуациями или процессами реального мира и в принятии решений на основе этих сходств, отвлекаясь на время от имеющихся различий. Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных.
Абстракция фокусируется на существенных с точки зрения наблюдателя характеристиках объекта.
Выделение общих черт различных классов в один класс-предок – это один из механизмов абстракции. Подобно тому, как абстракцию стек удобно использовать для решения ряда задач. Абстракция дерево – так же дает набор алгоритмов, успешно реализующих задачи поиска и сортировки, представления и хранения данных. Абстракция помогает справиться со сложностью рассматриваемой предметной области. Любая наука начинается с абстрагирования и классификации. Это облегчает жизнь.
Иерархия классов представляется в виде древовидной структуры, в которой более общие классы располагаются ближе к корню, а более специализированные – на ветвях и листьях.
Инкапсуляция скрывает детали реализации объекта.
Следующий важный принцип ОО-технологии – инкапсуляция.Этоозначает, что детали реализации объектов спрятаны в самих объектах. Приведем аналогию из реального мира: можно очень хорошо ездить на автомобиле, но при этом ничего не знать о том, как работает двигатель, как организована подача топлива и т.п. Подобно тому, как для вызова функции можно знать только ее интерфейс (тип возвращаемого значения и параметры) и можно совершенно спокойно забыть о том, как она реализована. Такое скрытие информации очень важно для разработки хорошего программного обеспечения. Еще одна аналогия инкапсуляции – это объект «черный ящик». У него есть некоторые входы, некоторые выходы. То есть, интерфейс взаимодействия с ним. А сама реализация скрыта внутри этого ящика. Подавая что-то на вход, получаем всегда что-то на выходе, не вдаваясь в принципы обработки информации внутри ящика.
Третьим китом, на котором стоит ООП, является полиморфизм – возможность использовать в различных классах иерархии одно имя для обозначения сходных по смыслу действий и гибко выбирать требуемое действие во время выполнения программы. Простым примером полиморфизма является перегрузка функций, когда из нескольких вариантов выбирается наиболее подходящая функция по соответствию ее прототипа передаваемым параметрам. Другой пример – использование шаблонов функций, когда один и тот же код видоизменяется в соответствии с типом, переданным в качестве параметра.
Другой пример приведен на картинке. Допустим, есть иерархия классов с базовым классом «Домашняя живность», которая описывает питомцев, которые живут на деревенском подворье. В этом базовом классе определена функция «Подать голос». В каждом дочернем, (производном от базового) классе питомца уже переопределена функция базового класса - «Подать голос». То есть, во всех классах иерархии «Домашняя живность» есть одно и то же имя, обозначающее схожее по смыслу действие – подача голоса. Благодаря полиморфизму, во время выполнения программы при вызове функции подачи голоса для любого питомца всегда будет вызываться нужная, соответствующая именно данному типу питомца (объекта) функция.
Итак, основными принципами ОО-технологии программирования являются: абстрагирование, инкапсуляция, наследование, полиморфизм.
Благодаря тому, что программа представляется в терминах объектов и их поведения, при программировании используются понятия более близкие к предметной области, следовательно программа легче читается и понимается. Это является большим преимуществом ООП. Однако проектирование ОО-программы – это весьма сложная задача. Сложность определяется одним важным этапом – разработкой иерархии классов. Плохо спроектированная иерархия приведет к созданию сложной и запутанной программы.
Классы и объекты.
Для объектно-ориентированного программирования характерен особый концептуальный подход к разработке программ, а язык С++ представляет собой расширение языка С за счет внедрения новых средств, которые облегчают применение этого подхода. К наиболее важным инструментальным средствам ООП (как мы уже выяснили) относятся следующие:
ü Абстрагирование.
ü Инкапсуляция и сокрытие данных.
ü Полиморфизм.
ü Наследование.
ü Повторное использование программного кода.
Класс представляет собой единственное наиболее важное усовершенствование языка С++, предназначенное для реализации этих свойств и связывания их в единое целое.
До сих пор мы говорили о встроенных типах, т.е. типах, определенных в самом языке. В одной из прошлых лекций мы познакомились со структурами, которые уже не являются встроенными типами. Сам программист определяет этот тип данных. Структура может содержать в своем составе множество переменных разных типов, как встроенных, так и пользовательских.
Классы - это типы, определенные программистом в конкретной программе. Определение класса включает в себя описание, из каких составных частей или атрибутов он состоит, а также какие операции, какой функционал определен для класса.
Предположим, в программе необходимо оперировать комплексными числами. Комплексные числа состоят из вещественной и мнимой частей, и с ними можно выполнять арифметические операции. Определим класс, с помощью которого можно будет манипулировать комплексными числами.
В большинстве случаев спецификация класса состоит из двух частей:
ü Объявления класса, в котором описаны компоненты данных в терминах элементов данных, и общедоступный интерфейс, описанный в терминах функций-элементов.
ü Определение методов класса, которые описывают как реализуются конкретные функции-элементы данного класса.
Начнем с объявления класса.
class Complex {public: int real; // вещественная часть int imaginary; // мнимая часть // прибавить комплексное число void Add(Complex x); };
Данный пример - упрощенное определение класса Complex, представляющее комплексное число. Определение класса задается ключевым словом class, которое в С++ идентифицирует данный программный код как код, определяющий конструкцию класса. Слово Complex отождествляется с именем типа нашего класса. Это объявление позволяет объявлять переменные, именуемые объектами или экземплярами класса типа Complex.
Комплексное число состоит из вещественной части - целого числа real и мнимой части, которая представлена целым числом imaginary. real и imaginary - это атрибуты класса. Для класса Complex определена одна операция или метод класса – Add, прототип которой описан в определении класса.
Самое замечательное свойство класса – это связывание в единый функциональный модуль данных и методов. Благодаря такой конструкции для объектов типа Complex устанавливаются правила, регламентирующие использование этих объектов.
Метка public описывает управление доступом к элементам класса. За счет использования подобных спецификаторов (о них речь пойдет дальше) любой программе можно ограничить доступ к элементам класса. Например, доступ к каким-то данным можно запретить. Такая изоляция данных от непосредственного доступа называется сокрытием данных.
Теперь выполним вторую часть спецификации класса – составление программных кодов, для тех функций-элементов, которые представлены прототипами в объявлении класса. В нашем случае – это функция сложения Add. Определение функций-элементов во многом аналогичны определениям обычных функций. Каждое такое определение состоит из заголовка функции и тела функции. Функции могут иметь возвращаемые типы и аргументы. В то же время они обладают двумя специфическими характеристиками:
ü При определении функции-элемента для идентификации класса, к которому эта функция принадлежит, используется оператор определения диапазона доступа «::».
ü Методы класса имеют полный доступ к компонентам класса.
Метод сложения Add может быть реализован следующим образом:
void Complex::Add(Complex x){ real = real + x.real; imaginary =imaginary + x.imaginary;}Итак, определив класс Complex, мы можем создать переменную (объект, экземпляр) типа Complex, чтобы затем её использовать:
Complex number;
Переменная с именем number содержит значение типа Complex, то есть содержит так называемый объект класса Complex. Имея объект, мы можем установить значения атрибутов объекта:
number.real = 1;number.imaginary = 2;Операция "." обозначает обращение к атрибуту объекта. Создав еще один объект класса Complex, мы можем прибавить его к первому:
Complex num2;number.Add(num2);
Как можно заметить, метод Add выполняется с объектом. Имя объекта (или переменной, содержащей объект), в данном случае, number, записано первым. Через точку записано имя метода - Add с аргументом - значением другого объекта класса Complex, который прибавляется к number. Объект number складывает свое значение со значением аргумента num2.
А главная main функция может выглядеть следующим образом.int main(){ // первый объект класса Complex Complex number; number.real = 1; number.imaginary = 3; // второй объект класса Complex Complex num2; num2.real = 2; num2.imaginary = 1; // прибавить значение второго // объекта к первому number.Add(num2); return 1;}<== предыдущая лекция | | | следующая лекция ==> |
О СВЕТОВЫХ ЯВЛЕНИЯХ, ВЫЗЫВАЕМЫХ ВЫСОКОЧАСТОТНЫМ ТОКОМ ВЫСОКОГО НАПРЯЖЕНИЯ, И ОБЩИЕ ЗАМЕЧАНИЯ ПО ЭТОМУ ВОПРОСУ | | | Общая информация о бабочках. |
Дата добавления: 2016-11-04; просмотров: 2258;