Принципы повторного использования и полиморфизм
Всегда ли нужно создавать новый класс?
Зачем использовать существующие классы?
Способы повторного использования классов
Композиция и агрегация
Пример композиции
Понятие обобщения/наследования
Создание и уничтожение объекта при наследовании
Дискуссионный вопрос
Интерфейс и его реализация
Понятие интерфейса в ООП
Понятие интерфейса в ООП
Пример применения интерфейса
Полиморфизм
Перегрузка (overloading) функций (методов)
Наследование обычных функций (методов) с перекрытием имен
Переопределение (overriding) виртуальных функций (методов)
Связывание (binding)
Method Overloading vs. Overriding
Полиморфизм: шаги реализации (1)
Полиморфизм: шаги реализации (2)
Абстрактные классы - интерфейсы
Повторное использование в С++
Повторное использование реализации и интерфейса
Резюме: рассмотренные вопросы
536.73K
Category: programmingprogramming

Принципы повторного использования и полиморфизм

1. Принципы повторного использования и полиморфизм

1.
2.
3.
4.
5.
6.
7.
8.
9.
Способы повторного использования классов
Композиция и агрегация
Наследование/Обобщение. Виды наследования
Создание и уничтожение объекта при наследовании
Принцип полиморфизма
Перегрузка и переопределение методов
Виртуальные функции
Статическое и динамическое связывание
Повторное использование интерфейса и реализации
Преподаватель:
Ботов Дмитрий Сергеевич

2. Всегда ли нужно создавать новый класс?

Задача
Требуется создать
новый класс
Решения
Проектирование
новых классов «с нуля»,
с последующим кодированием
и тестированием
Использование для создания
новых классов уже
существующих классов,
хорошо зарекомендовавших
себя
2

3. Зачем использовать существующие классы?

• Повторное использование ранее принятых решений
• Делает решение гибким и мобильным
• Существующие классы, как правило, хорошо отлажены и
показали себя в работе
3

4. Способы повторного использования классов

• «содержит»
• «является частью»
• «реализуется посредством»
• «является» («is a»)
• «частное / общее»
• «реализует интерфейс»
4

5. Композиция и агрегация

Композиция/агрегация – это отношение между типами,
которое возникает тогда, когда объект одного типа
содержит в себе объекты других типов
Правило: моделируйте отношение «содержит» или
«реализуется посредством» с помощью
композиции/агрегации
5

6. Пример композиции

// Колесо
class CWheel
{
...
};
// Двигатель
class CEngine
{
...
};
// Кузов
class CBody
{
...
};
// Автомобиль
class CAutomobile
{
public:
...
private:
CBody m_body;
CEngine m_engine;
CWheel m_wheels[4];
};
6

7.

Пример агрегации
class Professor;
class UniversityDepartment {

private:
Professor** professors; // массив указателей на объекты, живущие своей жизнью
public:
/* constructor */
UniversityDepartment (int profAmount) {
professors = new Professor[ profAmount ];
for (int pi = 0; pi < profAmount; pi++)
professors[ pi ] = NULL;
}// constructor
/* destructor */
~UniversityDepartment() {
delete[] professors; // удаляем массив, но не сами объекты в нём
}// destructor

};// class UniversityDepartment ...

8.

Пример композиции
class Employee;
class UniversityDepartment;
class University {

private:
Employee rector; // объект создается автоматически
UniversityDepartment* departments; // массив экземпляров, а не указателей на них
public:
/* constructor */
University (int depAmount) {
departments = new UniversityDepartment [ depAmount ];
}// constructor
/* destructor */
~University () {
delete[] departments; // все департаменты уничтожаются
// объект rector уничтожается
}// destructor

};// class University ...

9. Понятие обобщения/наследования

Cвязь типа «является» («is a») или «частное/общее»
Животное
+возраст : double
+Родиться() : void
+Умереть() : void
Млекопитающее
+ПитьМолоко() : void
Насекомое
+Ползать() : void
9

10.

Пример наследования
class Animal {
private:
int age;

};
// возраст
class Mammal : public Animal {
public:
int GetAge() { return age; }
void SuckMilk() { … }

};
// млекопитающее
class Insect : public Animal {
public:
int GetAge() { return age; }
void Crawl() { … }

};
// насекомое
// можно вынести функцию в родителя

11.

Виды наследования
Объекты дочернего класса (подкласса) наследуют все свойства и
поведение родительского класса (суперкласса)
Типы наследования:
• public – открытое наследование
все модификаторы доступа полей и методов
суперкласса в подклассе остаются без изменений
• protected – защищенное наследование
public поля и методы суперкласса
в подклассе становятся protected
• private – закрытое наследование
все поля и методы суперкласса
в подклассе становятся private
class Pub : public A {};
class Pro : protected A {};
class Pri : private A {};

12. Создание и уничтожение объекта при наследовании

Создание объекта
Конструктор первичного
суперкласса
вызов

вызов
Уничтожение объекта
Деструктор класса
вызов
Деструктор суперкласса
Конструктор суперкласса
вызов
вызов
вызов
Конструктор класса

Деструктор первичного
суперкласса
12

13. Дискуссионный вопрос

Что общего у этих объектов?
13

14. Интерфейс и его реализация

интерфейс
Доступ
к
объекту
Объект
Реализация
интерфейсов
интерфейс
14

15. Понятие интерфейса в ООП

Интерфейс — это конструкция в коде программы,
используемая для специфицирования услуг,
предоставляемых классом или компонентом
15

16. Понятие интерфейса в ООП

• Интерфейс определяет границу взаимодействия между
классами или компонентами, специфицируя определенную
абстракцию
• Операции интерфейса реализуются (алгоритмизируются)
конкретными классами, которые поддерживают интерфейс
• Класс (и все его объекты) могут иметь один или несколько
интерфейсов
16

17. Пример применения интерфейса

«interface»
IFly
+Landing()
+Take_Off()
Ворона
+Landing()
+Take_Off()
Ракета
+Landing()
+Take_Off()
Boeing-747
+Landing()
+Take_Off()
ТУ-154
+Landing()
+Take_Off()
17

18. Полиморфизм

Полиморфизм
(от др.греч. — многообразный) — свойство, которое
позволяет использовать один и тот же интерфейс для
общего класса действий
"один интерфейс, несколько методов"
• Можно спроектировать общий интерфейс для группы связанных
между собой действий
• Конкретное действие определяется конкретным характером
ситуации
18

19. Перегрузка (overloading) функций (методов)

• Определение функций (методов) с одинаковым именем,
но с разным списком параметров (разные типы и/или
количество параметров)
• Способ борьбы со сложностью кода
class Printer
{
public:
void print(string str);
void print(Document doc);
void print(HTMLpage page);
};
19

20. Наследование обычных функций (методов) с перекрытием имен

class TextDocument
{
public:
void print();
TextDocument doc;
doc.print();
};
HTMLPage page;
page.print();
class HTMLPage : public TextDocument
{
Указатель типа
суперкласса на объект
подкласса
TextDocument* pDoc = &page;
pDoc->print();
public:
void print();
};
Выбор вызываемого метода зависит от типа переменной (указателя)
20

21. Переопределение (overriding) виртуальных функций (методов)

class TextDocument
{
public:
virtual void print();
Переопределение (overriding)
действует для виртуальных функций (методов)
с одинаковым именем и списком параметров
};
TextDocument* pDoc = new TextDocument();
pDoc->print();
TextDocument* pDoc = new HTMLPage();
class HTMLPage : public TextDocument
pDoc->print();
{
public:
Выбор вызываемого метода зависит от типа созданного объекта
void print();
};
21

22. Связывание (binding)

Статическое связывание:
случай overloading
MyClass* obj = new MyClass;
obj->method(5);
void MyClass::method(char c) {…}
void MyClass::method(int k) {…}
Выбор реализации метода зависит от
списка фактических параметров
Динамическое связывание:
случай overriding
SuperClass* obj = new SubClass;
obj->method(5);
virtual void SuperClass::method(int k)
{
// реализация «по умолчанию»
}
void SubClass::method(int k)
{
// переопределенная реализация
}
Выбор реализации метода зависит от
типа созданного объекта
22

23. Method Overloading vs. Overriding

Overloading
Overriding
Определение
Определение функций с
одинаковым именем, но с разным
списком параметров (разные типы
и/или количество параметров)
Определение в подклассе метода с
именем и списком параметров,
совпадающим с методом
суперкласса, но отличающимся
реализацией в коде
Поведение
Добавляет/Расширяет поведение
существующих методов для другого
набора/типов данных
Изменяет существующее
поведение метода
Сигнатуры методов
Сигнатуры должны отличаться
списком параметров
Сигнатуры не должны отличаться
Наследование
Необязательно
Обязательно
Связывание
Статическое
Динамическое
Полиморфизм
Времени компиляции
Времени выполнения
23

24. Полиморфизм: шаги реализации (1)

1. Определить иерархию наследования классов
2. Переопределить в подклассах виртуальные функции,
унаследованные от суперкласса
class TextDocument
{
public:
virtual void print();
};
class HTMLPage : public TextDocument
class PDFDocument : public TextDocument
{
{
public:
public:
};
HTMLPage(string URL);
PDFDocument(File* pFile);
virtual void print();
virtual void print();
};
24

25. Полиморфизм: шаги реализации (2)

3. Объявить указатель (или массив указателей) типа суперкласса
4. Создать объект нужного подкласса (сохранив адрес в
объявленном ранее указателе)
5. Вызвать переопределенный метод через указатель на объект
TextDocument* pDoc;
if(/*условие*/)
pDoc = new HTMLPage(url);
else
pDoc = new PDFDocument(pFile);
pDoc->print();
25

26. Абстрактные классы - интерфейсы

class Printable
{
Чисто виртуальная функция
(абстрактная)
public:
virtual void print() = 0;
};
Отношение реализации
class String : public Printable
class Document : public Printable
class HTMLPage : public Printable
{
{
{
public:
public:
public:
String(string str);
virtual void print();
};
HTMLPage(string url);
Document(File* pFile);
virtual void print();
};
virtual void print();
};
26

27. Повторное использование в С++

• Правило 1: Используйте открытое наследование для
моделирования отношения «является»
• Правило 2: Моделируйте отношение «содержит» или
«реализуется посредством» с помощью композиции
(агрегации)
• Правило 3: Различайте наследование интерфейса от
наследования реализации
27

28. Повторное использование реализации и интерфейса

Способ
Агрегация/
композиция
Наследование
не виртуальных
функций
Наследование
виртуальных
функций
Наследование
чисто виртуальных
функций
Закрытое
наследование
Реализация
Интерфейс
+
+
+
(обязательная)
+
+
(по умолчанию)
-
+
+
-
28

29. Резюме: рассмотренные вопросы

• Зачем использовать существующие классы?
• Какие существуют способы повторного использования?
• В каком случае стоит применять наследование, а в каком – композицию
или агрегацию?
• Какие существуют виды наследования?
• В чем заключается принцип полиморфизма?
• Что такое перегрузка и переопределение методов?
• Чем отличаются виртуальные и невиртуальные функции при
наследовании?
• В чем отличие использования статического и динамического связывания?
• Каковы шаги реализации полиморфизма в программном коде?
• Как обеспечить повторное использование реализации и интерфейса?
29
English     Русский Rules