Принципы объектно-ориентированного программирования Лекция
Принципы объектно-ориентированного программирования Лекция № 6
Принципы объектно-ориентированного программирования n Инкапсуляция n Наследование n Полиморфизм n Композиция n Наполнение
Принцип инкапсуляции Описание класса на языке Паскаль: class имя_класса { private: описание личных элементов класса public: описание общих элементов класса }; Личные элементы классы – доступные только в методах класса. Общие элементы класса – доступные в любой точке программы. Принцип инкапсуляции: личные элементы класса – поля, общие элементы класса – методы, хотя методы могут быть и личными. Другая формулировка: поля класса доступны только методам своего класса.
Принцип инкапсуляции Инкапсуляция – такое объединение внутри класса полей и методов, при котором доступ к полю возможен только путем вызова соответствующего метода.
Уровни инкапсуляции n private (личный) n public (общий) n protected (защищенный) n published – среды формы Borland n automated – среды формы Borland
Уровень инкапсуляции private (личный) Уровень private накладывает самые жесткие ограничения на доступ к элементам класса. Именно, эти элементы могут быть использованы только методами данного класса. Как правило, поля класса объявляются private.
Уровень инкапсуляции public (общий) Элементы класса уровня public доступны из любой точки программы (самый «широкий» доступ).
Уровень инкапсуляции protected (защищенный) Элементы класса уровня protected доступны методам данного класса и его наследников (о наследовании см. далее)
Уровень инкапсуляции published Borland C++ Builder, Delphi Уровень доступа published аналогичен public, но применяется для компонентов, используемых при проектировании форм оконного приложения. Уровень published обычно применяется к свойствам. Свойства дают возможность использования данных класса в программе, при этом неявно вызываются соответствующие методы. Данные с таким порядком доступа и называются свойствами.
Свойства – специальный вид полей Использование свойства: имя_свойства = выражение {при изменении свойства неявно вызывается метод, изменяющий свойство}; …=… имя_свойства…{при использовании значения свойства неявно вызывается метод, возвращающий значение свойства} Свойства – компромисс между соблюдением принципа инкапсуляции и удобством программирования.
Принцип наследования Наследование – это возможность определения для базового класса (предка) иерархии производных классов (наследников), в каждом из которых доступны элементы базового класса (их описание становится частью описания производного класса). Другими словами: наследование – механизм, посредством которого класс может наследовать элементы другого класса и добавлять к ним свои элементы. Или: наследование - конструирование новых более сложных производных классов (классов-потомков) из уже имеющихся базовых классов (классов-родителей) посредством добавления полей и методов. Это – эффективное средство расширения функциональных возможностей существующих классов без их перепрограммирования иповторной компиляции существующих программ.
Простейший пример наследования Класс студент … Класс студент технического вуза гуманитарного вуза медицинского вуза Класс студент МЭИ Класс студент МВТУ … Как правило: • базовый класс является более общим, производные – Класс студент ГПИ Класс студент АВТИ более специальными. … • производный класс имеет больше элементов, чем … базовый (при наследовании добавляются элементы)
Простейший пример наследования Класс ТОЧКА (x, y) … Класс круг (x, y, R) Класс квадрат со сторонами, параллельными координатным осям (x, y, a) Класс эллипс с осями, параллельными координатным осям (x, y, a, b) Класс квадрат, произвольно ориентированный относительно координатных осей (x, y, a, ) Класс эллипс, произвольно ориентированный относительно координатных … осей (x, y, a, b, ) …
Наследование Единичное Множественное количество количество предков=1 предков>1 В СИ++ допустимо множественное наследование, в Объектном Паскале, например, нет.
Личные элементы класса-предка не наследуются! Т. е. в Наследование классе-наследнике не доступны при любом виде наследования! Личное Общее Защищенные Защищенное Защищенные и и общие общие элементы Защищенные и класса-предка класса- общие элементы сохраняют свой предка класса-предка уровень доступа становятся в наследнике общими в защищенными в наследнике Объектный паскаль: только общее наследование.
Видимость компонентов базового класса в производном при различных видах наследования Вид наследования Объявление компонентов Видимость компонентов в в базовом классе производном классе private не доступны private protected private public private не доступны protected public protected private не доступны public protected public
Самое простое наследование – public. Описание класса-наследника в Си++ class имя_наследника: public имя предка { описание собственных элементов класса } //public – общее наследование, иначе личное. //множественное наследование class имя_наследника: public имя предка 1, public имя предка 2 { описание собственных (добавляемых) элементов класса } //проблема: элементы классов-предков могут иметь //одинаковые имена – это причина, почему множественное наследование не может быть только общим
Описание класса-наследника в общем случае class Имя_наследника: Вид_наследования 1 Имя_предка 1, Вид_наследования 2 Имя_предка 2, … Вид_наследования. N Имя_предка. N, {Описание собственных элементов};
Принцип полиморфизма Полиморфизм – возможность определения единого по имени метода для всей иерархии производных классов, причем в каждом классе этот метод может реализовываться со своими особенностями.
Простейший пример точка круг квадрат правильный шестиугольник группа кругов группа квадратов группа прав. шестиугольников Методы: show (показать), hide (спрятать) – одинаковые для всех классов имена (переопределенные методы), но разную реализацию. Метод Move (поступательное движение) – одинаковый метод для всех классов: hide(); x=x+dx; y=y+dy; show(); Проблема: как Move выберет метод своего класса? Решение: Использование виртуальных методов.
Методы Виртуальные Обычные (не виртуальные) позднее связывание: раннее связывание: подключение к программе на этапе выполнения компоновки реализуется с помощью VMT (Virtual Method Table) – таблица, в которой для каждого виртуального метода указывается адрес его реализации в данном классе
Virtual n virtual – объявление виртуального метода (в классе-предке), ставится перед прототипом метода; n в классе-наследнике virtual необязательно.
Пример наследования и полиморфизма class Pnt /*точка*/ { private: int x, y, color; public: Pnt(int a, int b, int c); /*в наследнике будет переопределяться, но не вызывается другим методом, поэтому не виртуальный*/ virtual void Show(); /*будут переопределяться, */ virtual void Hide(); /*вызываются Move*/ void Move (int dx, int dy); /*не будет переопределяться, вызывает Show и Hide*/ } Pnt : : Pnt (int a, int b, int c); { x=a; y=b; color=c; } void Pnt : : Show(); { … } void Pnt : : Hide(); { … };
Пример наследования и полиморфизма (продолжение) void Pnt : : Move(int dx, int dy); { Hide(); x=x+dx; y=y+dy; Show(); } class Crcl: public Pnt private: int r; public: Crcl (int a, int b, int c, int rad); void Show(); void Hide(); /*Move не переопределяется, берется из Pnt*/ end;
Пример наследования и полиморфизма (продолжение) Crcl : : Crcl (int a, int b, int c, int rad); { Pnt (a, b, c, ); r=rad; }; P(класс Pnt) Move(Pnt) Show(Pnt) void Crcl : : Show(); {… Невирт. } Вирт. void Crcl : : Hide(); C(класс Crcl) Move(Pnt) Show(Crcl) { … }; void main() {Pnt* P; Crcl* C; P=new Pnt (10, cl. Red); C=new Crcl (50, cl. Blue, 10); P->Move(10, 10); C->Move(50, 50); … delete P; delete C; }
Абстрактные методы и классы Абстрактный метод – виртуальный метод, не имеющий реализации. Абстрактный класс – имеющий абстрактные методы.
лк6_часть2_Принципы_обьектно-ориентированного_программирования.ppt
- Количество слайдов: 26

