Top Banner
Бублик Володимир Васильович Програмування - 2 Лекція 9. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів Лекції для студентів 2 курсу
43
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 09 Object And Class Hierarchy

Бублик Володимир Васильович

Програмування - 2

Лекція 9. Об'єктне програмування.

Ієрархія об’єктів і ієрархія класів

Лекції для студентів 2 курсу

Page 2: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

2

Повторення: масив, агрегований в стек

• // Назва класу підкреслює спосіб організації ієрархії

• class StackAggregatingArray;

Page 3: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

3

Зауваження

• Все, про що йтиметься в лекції, дослівно переноситься на випадок параметризованих класів

• З метою спрощення позначень працюватимемо з простими класами, позначивши тип елемента через Elem і не вдаючись в деталі, як він визначається (через typedef чи template)

• Вправа. Розповсюдьте приклади лекції на параметризовані класи

Page 4: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

4

Стек агрегує масив

• class StackAggregatingArray• {• public:• StackAggregatingArray(size_t);• ~StackAggregatingArray();• const Elem& top() const;• void pop();• void push(const Elem& value);• private:• static const size_t _bos; • size_t _top;• Array _stackArray;• };

Page 5: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

5

Агрегований масив

• class Array• {• public:• Array (size_t);• ~Array();• private:• Elem * _pa;• size_t _size;• Elem& operator[] (size_t);• const Elem& operator[] (size_t) const;• };

Page 6: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

6

Властивості агрегації

• Кожен агрегат (стек) містить в собі екземпляр агрегованого об'єкту (масив)

• Агрегат (стек) має доступ лише до відкритої частини агрегованого об'єкту (масиву)

• Користувачі агрегату (стеку) взагалі не мають доступу до агрегованого об'єкту (масиву)

• При необхідності доступ до агрегованого об'єкту делегується шляхом розширення функціональності агрегату (чи завжди таке розширення функціональності виправдане?)

Page 7: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

7

Стек з підгляданням

• Розширимо функціональність стеку операцією індексування, делегованою масиву, відповідно змінивши назву класу

Page 8: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

8

Стек з підгляданням

• class PeekBackStackAggregatingArray• {• public:• StackAggregatingArray(size_t);• ~StackAggregatingArray();• const Elem& top() const;• void pop();• void push(const Elem& value);• const Elem& operator[] (size_t) const;• private:• static const size_t _bos; • size_t _top;• Array _stackArray;• };

Page 9: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

9

Спроба реалізації (невдала)

• // Between bad and very bad• const int& PeekBackStackAggregatingArray::• operator[] (size_t index) const• {• if (index>_size)• // throw do not know what to do• // else delegate indexing to Array• return _pa[index];• }

Page 10: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

10

Проблеми

• Не підтримується зв’язок класу PeekBackStackAggregatingArray з класом StackAggregatingArray

• кожна із спільних операцій має власну реалізацію у своєму класі

• При необхідності внесення змін їх доведеться вносити у декілька класів

• Як реагувати на спробу підглянути на неіснуючий елемент стеку?

Page 11: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

11

Дублювання операцій

• За доступ до масиву платимо дублюванням функціональності стеку

• const Elem& PeekBackStackAggregatingArray::• top() const• {• return _pa[_top];• }

Page 12: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

12

Акуратніше підглядання

• class PeekBackStackAggregatingArray• {• public:• PeekBackStackAggregatingArray(size_t);• ~ PeekBackStackAggregatingArray();• const Elem& top() const;• void pop();• void push(const Elem& value);• bool peekback(size_t, Elem &) const;• private:• static const size_t _bos; • size_t _top;• Array _stackArray;• };

Page 13: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

13

Друга спроба реалізації

• // Between bad and fair• bool PeekBackStackAggregatingArray::• peekback(size_t index, Elem & elem) const• {• if (index>_size)• return false;• // delegate indexing to Array• elem = _pa[index];• return true;• }

Page 14: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

14

Успадкування

• Визначимо два зв'язаних між собою класи: один залишиться звичайним стеком, інший стане особливим стеком, доповненим додатковою функціональністю

• Скажемо, що стек з підгляданням суть клас, похідний від стеку, а сам стек базовий клас для стеку з підгляданням

Page 15: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

15

Формула (відкритого) успадкування

Студент теж людина

• Підоб'єкт успадковує всі властивості (атрибути) і поведінку (відкриті методи) базового об'єкту

• Підоб'єкт може мати власні додаткові властивості і поведінку

• Підоб'єкт не має доступу до закритої частини базового об'єкту

Page 16: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

16

Відкрите (повне) успадкування. Приклад

• // PeekBackStackAggregatingArray суть повноцінний

• // StackAggregatingArray, але• // з додатковими можливостями

• class PeekBackStackAggregatingArray: public StackAggregatingArray

• {• public:• PeekBackStackAggregatingArray(size_t);• ~ PeekBackStackAggregatingArray();• bool peekback(size_t, Elem &) const;• };

Page 17: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

17

Правила доступу при успадкуванні (будь-якому)

• Клієнт похідного класу має повний доступ до відкритої частини як базового, так і похідного класу

• PeekBackStackAggregatingArray s(100);• // повна поведінка стеку• s.push(10);• cout<<s.top();• int peeked;• if (s.peekback(2, peeked))• cout<< peeked;• // s.peekback(10, peeked) == false

Page 18: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

18

Створення похідних об'єктів

• Кожне виконання конструктора похідного класу починається з виклику конструктора базового класу незалежно від того, чи згадано цей виклик у списку ініціалізації (якщо ні, то без параметрів)

• PeekBackStackAggregatingArray::• PeekBackStackAggregatingArray (size_t sz):• // Ініціалізація базового об’єкту• StackAggregatingArray (sz)• {• return;• }

Page 19: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

19

Створення похідних об'єктів

• Компілятор виявить помилку, що полягатиме у спробі виклику конструктора за замовчуванням (без параметрів) для базового класу StackAggregatingArray

• PeekBackStackAggregatingArray::• PeekBackStackAggregatingArray (size_t sz)• {• return;• }• Помилки компіляції не буде, якщо

StackAggregatingArray матиме замовчуване значення параметру, але буде серйозна помилка виконання (чому?)

Page 20: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

20

Видалення похідних об'єктів

• Оскільки атрибути похідних об'єктів можуть посилатися на атрибути базового об'єкту, то спочатку видаляються всі власні компоненти похідного об'єкту, а потім автоматично викликається деструктор

• Базовий об'єкт не знає нічого про свої похідні об'єкти

Page 21: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

21

Відкрите (повне) успадкування. Діаграма

композиція

успадкуванняСтек з

підгляданням не

одержав доступу до

operator[], який мав стек

Page 22: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

22

• Похідний клас (стек з підгляданням) тепер втратив доступ до закритої частини базового класу (масиву)

• bool PeekBackStackAggregatingArray::• peekback(size_t index, Elem & elem) const• {• if (index>_size)• return false;• // delegate indexing to Array• elem = _pa[index];• return true;• }

Правила доступу: проблема

Page 23: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

23

Знову проблема

• Як надати похідному стеку з підгляданням доступ до оператора індексування масиву, агрегованого в базовий стек?

• Можливі варіанти:

1. Включити операцію індексування до відкритої частини стеку ― дуже погано (спотворений стек)

2. Надати підоб'єкту особливі права до закритої частини базового класу ― неможливо

3. Визначити особливі правила доступу похідних класів до базових: protected ― закрите для всіх, крім похідних

Page 24: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

24

Захищена частина класу

• Додатково до закритої (private), недоступної нікому, і відкритої (public), доступної всім, частин класу визначаємо захищену (protected) частину

• class AnyClass• {• private:• // only for me• protected:• // only for me and my subclasses• public:• // for everyone• }

Page 25: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

25

Все ще не дуже вдалий проект: захищений метод

• class StackAggregatingArray• {• public:• StackAggregatingArray(size_t);• ~StackAggregatingArray();• const Elem& top() const;• void pop();• void push(const Elem & value);• protected:• const Elem& operator[] (size_t) const;• private:• static const size_t _bos; • size_t _top;• Array _stackArray;• };

Page 26: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

26

Стек, спотворений невластивою йому операцією

• Захищений оператор тепер доступний підкласу, але стек залишається спотвореним

Page 27: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

27

Третя спроба реалізації

• // Still not very good• bool PeekBackStackAggregatingArray::• peekback(size_t index, Elem & elem) const• {• if (index>_size)• return false;• // inherited protected operator from a base

class• elem = (*this) [index];• return true;• }

Page 28: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

28

Інший вид успадкування

• Як вбудувати масив до стеку так, щоб стек міг передати функціональність масиву своїм похідним класам

• Варіант 1. Зробити стек похідним від масиву. Дуже погано, бо відкриється повний доступ до всіх елементів стеку, в тому числі неіснуючих

• Варіант 2. Розглянути закрите успадкування, тепер підклас одержить доступ не тільки до відкритої, але й до захищеної частини класу

Page 29: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

29

Закрите успадкування (реалізації)

• class StackAggregatingArray : private Array• {• public:• StackAggregatingArray(size_t);• ~StackAggregatingArray();• const Elem& top() const;• void pop();• void push(const Elem& value);• protected:• const int& operator[] (size_t) const;• private:• static const size_t _bos; • size_t _top;• };

Page 30: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

30

Закрите успадкування (реалізації). Діаграма

• Підклас має доступ до відкритої і захищеної частини базового класу, але не передає цих прав своїм підкласам

• Стек все ще мусить містити “чужу” операцію

Page 31: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

31

Заміна реалізації захищеного методу

• Проект все ще не дуже вдалий, оскільки стек продовжує містити невластиву йому операцію, правда, реалізовану в інший спосіб

• const Elem& StackDerivedFromArray::• operator[] (size_t index) const• {• // delegate indexing to its base class Array• // and transmit it to PeekBackStack• return (*this) [index];• }

Page 32: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

32

Четверта спроба реалізації

• Хоч спосіб реалізації операції індексування у стеку змінився, стек з підгляданням залишився без змін

• bool PeekBackStackAggregatingArray::• peekback(size_t index, Elem & elem) const• {• if (index>_size)• return false;• elem = (*this) [index];• return true;• }

Page 33: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

33

Третій вид успадкування

• Розглянемо успадкування, яке захищає базовий клас від стороннього доступу, передаючи права доступу до нього лише власним похідним класам

Page 34: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

34

Транзитивне (захищене) успадкування

• Підклас передає своїм підкласам доступ до відкритої і захищеної частини базового класу так, як ніби вони складали його захищену частину

• operator[] класу Array одержав статус захищеного оператора класу StackDerivedFromArray

Page 35: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

35

Транзитивне успадкування реалізації

• class StackDerivedFromArray : protected Array• {• public:• StackAggregatingArray(size_t);• ~StackAggregatingArray();• const Elem& top() const;• void pop();• void push(const Elem& value);• private:• static const size_t _bos; • size_t _top;• };

Page 36: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

36

Для стеків успадкування залишається відкритим

• // PeekBackStackDerivedFromArray суть повноцінний

• // StackDerivedFromArray, але• // з додатковими правами доступу

• class PeekBackStackDerivedFromArray: public StackDerivedFromArray

• {• public:• PeekBackStackAggregatingArray(size_t);• ~ PeekBackStackAggregatingArray();• bool peekback(size_t, Elem &) const;• };

Page 37: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

37

П'ята (остаточна) спроба реалізації

Доступ до самого масиву• bool PeekBackStackDerivedFromArray::• peekback(size_t index, Elem & elem) const• {• if (index>_size)• return false;• // Now direct operator[] from Array• elem = (*this) [index];• return true;• }

Page 38: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

38

Типи успадкувань

Успадкування лише реалізації• private: відкрита і захищена частини базового

класу може використовуватися в похідному класі

• protected: транзитивне (захищене) ― відкрита і захищена частини базового класу може використовуватися в усіх похідних класах

Успадкування реалізації і поведінки ― public: відкрита частина базового класу стає одночасно відкритою частиною похідного класу

Page 39: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

39

Порівняння агрегації і успадкування

Агрегація:• Агрегат користується об'єктом виключно сам

Успадкування:• Закрите: похідний об'єкт користується базовим

об'єктом виключно сам• Захищене: похідний об'єкт користується

базовим об'єктом сам і передає ці права своїм похідним об'єктам

• Відкрите: похідний об'єкт користується базовим об'єктом сам і передає ці права своїм похідним об'єктам і клієнтам

Page 40: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

40

Порівняння рішень для стеку: агрегація

• Дуже добре рішення: стек має повний доступ до масиву, але приховує його

• При агрегації указником можлива кратна динамічна агрегація

• Проблема: делегування доступу похідним класам

Page 41: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

41

Порівняння рішень для стеку:закрите успадкування (реалізації)

• Стек має повний доступ до масиву і приховує його

• Повністю статична структура: при будь-якій зміні в масиві всі похідні класи перекомпільовуються

• При використанні захищеного успадкування доступ транзитивно передається підкласам

Page 42: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

42

Порівняння рішень для стеку:захищене (транзитивне) успадкування

(реалізації)• Стек має повний

доступ до масиву і приховує його

• Повністю статична структура: при будь-якій зміні в масиві всі похідні класи перекомпільовуються

• При використанні захищеного успадкування доступ транзитивно передається підкласам

Page 43: 09 Object And Class Hierarchy

© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів

43

Висновок

• Успадкування реалізації і агрегація мають спільні риси: віддаємо перевагу агрегації, якщо не виникає потреба транзитивно делегувати доступ до “захованого” класу