КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Основными принципами ООП являются инкапсуляция, наследование и полиморфизм.1. Объединение данных с функциями их обработки в сочетании со скрытием ненужной для использования этих данных информации называется инкапсуляцией (encapsulation). Эта идея не нова и применялась в структурном и модульном программировании, а в ООП получила свое логическое завершение. Инкапсуляция повышает степень абстракции программы: данные класса и реализация его функций находятся ниже уровня абстракции, и для написания программы информация о них не требуется. Кроме того, инкапсуляция позволяет изменить реализацию класса без модификации основной части программы, если интерфейс остался прежним (например, при необходимости сменить способ хранения данных с массива на стэк). Простота модификации является очень важным критерием качества программы. Инкапсуляция позволяет использовать классы в другом окружении и быть уверенным, что он не испортит не принадлежащие ему области памяти, а также создавать библиотеки классов для применения во многих программах. 2.Наследование –этот принцип относится только к классам объектов. Наследование означает, что каждый объект может иметь наследников, каждый из которых будет обладать всеми полями и методами своего предка. Кроме того, как правило, классы-наследники совместимы по типу со своими предками (к сожалению это справедливо не для всех ОО языков). Наследование бывает двух видов: 1) одиночное – когда каждый класс имеет одного и только одного предка; 2) множественное – когда каждый класс может иметь любое количество предков. Множественное наследование обладает более мощными возможностями: в одном классе-наследнике объединяюстся свойства (поля и методы) множества различных классов. К примеру один из предков может рисовать себя, а другой – производить вычисления. Представители их наследника смогут делать и то, и другое. 3. Полиморфизм – этот принцип неразрывно связан с наследованием и гласит, что каждый класс наследник может обладать не только свойствами, унаследованными от предка, но и своими собственными. В частности, свойства предка могут быть перекрыты наследником - на место свойств предка могут быть подставлены свойства наследника. Существование принципа полиморфизма является естественным следствием существования принципа наследования: наследование без изменения набора свойств не имеет смысла. Кроме того, без полиморфизма невозможно реализовать объединение различных объектов (классов) по некоторому набору свойств (невозможно абстрагироваться от части свойств объектов), а без этого теряется весь смысл подхода. Позднее связывание.Несмотря на то, что три перечисленных принципа называют "тремя китами ООП", сами по себе они не имеют смысла без наличия особого механизма, названного поздним (динамическим) связыванием. Рассмотрим след. пример: monstr *p; // описывается указатель на базовый класс p = new daemon; // указатель ссылается на объект Вызов методов объекта происходит в соответствии с типом указателя, а не фактическим типом объекта, на который он ссылается, поэтому при выполнении оператора: p->draw (1, 1, 1, 1); будет вызван метод класса monstr, а не daemon, поскольку ссылки на методы разрешаются во время компоновки программы. Этот процесс называется ранним связыванием. Чтобы вызвать метод класса daemon, можно использовать явное преобразование типа указателя: ((daemon * p)) -> draw (1, 1, 1, 1); Это не всегда возможно, поскольку в разное время указатель может ссылаться на объекты разных классов иерархии, и во время компиляции программы конкретный класс может быть не известен. Наряду с ранним связыванием реализован механизм позднего связывания, когда разрешение ссылок на метод происходит на этапе выполнения программы в зависимости от конкретного типа объекта, вызвавшего метод. Для определения виртуального метода используется спецификатор virtual, например: virtual void draw (int x, int y, int scale, int position); Если определить метод draw в классе monstr как виртуальный, решение о том, метод какого класса вызвать, будет приниматься в зависимости от типа объекта, на который ссылается указатель: monstr *r, *p; r = new monstr; //создается объект класса monstr p = new daemon; //создается объект класса daemon r -> draw (1, 1, 1, 1); //вызывается метод monstr :: draw p -> draw (1, 1, 1, 1); //вызывается метод daemon :: draw p -> monstr::draw (1, 1, 1, 1); //обход механизма виртуальных методов Если объект класса daemon будет вызывать метод draw не непосредственно, а косвенно (т.е. из другого метода, определенного в классе monstr), будет вызван метод draw класса daemon. Итак, виртуальным называется метод, ссылка на который разрешается на этапе выполнения программы (virtual – «фактический», т.е. ссылка разрешается по факту вызова). [Для каждого объекта содержащего хотя бы один виртуальный метод, компилятор создает таблицу виртуальных методов (vtbl), в которой для каждого виртуального метода записан его адрес в памяти. Адреса методов содержатся в таблице в порядке их описания в классах. Каждый объект содержит скрытое дополнительное поле ссылки на vtbl, называемое vptr. Оно заполняется конструктором при создании объекта. На этапе компиляции ссылки на виртуальные методы заменяются на обращения к vtbl через vptr объекта, а на этапе выполнения в момент обращения к методу его адрес выбирается из таблицы. Т.о., вызов виртуального метода, в отличие от обычных методов и функций, выполняется через дополнительный этап получения адреса метода из таблицы. Это несколько замедляет выполнение программы. Виртуальный механизм работает только при использовании указателей или ссылок на объекты. Объект, определенный через указатель или ссылку и содержащий виртуальные методы, называется полиморфным. [В данном случае полиморфизм состоит в том, что с помощью одного и того же обращения к методу выполняются различные действия в зависимости от типа, на который ссылается указатель в каждый момент времени.] Можно создать функцию, параметром которой является указатель на абстрактный класс (содержащий хотя бы 1 вирт.метод). А на место этого параметра при выполнении программы может передаваться указатель на объект любого производного класса. Это позволяет создавать полиморфные функции, работающие с объектом любого типа в пределах одной иерархии.] Методы и средства защиты компьютерной информации/Информационная безопасность и защита информации
|