09 Object And Class Hierarchy
-
Upload
olegapster -
Category
Technology
-
view
277 -
download
2
Transcript of 09 Object And Class Hierarchy
Бублик Володимир Васильович
Програмування - 2
Лекція 9. Об'єктне програмування.
Ієрархія об’єктів і ієрархія класів
Лекції для студентів 2 курсу
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
2
Повторення: масив, агрегований в стек
• // Назва класу підкреслює спосіб організації ієрархії
• class StackAggregatingArray;
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
3
Зауваження
• Все, про що йтиметься в лекції, дослівно переноситься на випадок параметризованих класів
• З метою спрощення позначень працюватимемо з простими класами, позначивши тип елемента через Elem і не вдаючись в деталі, як він визначається (через typedef чи template)
• Вправа. Розповсюдьте приклади лекції на параметризовані класи
© Бублик В.В. Програмування-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;• };
© Бублик В.В. Програмування-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;• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
6
Властивості агрегації
• Кожен агрегат (стек) містить в собі екземпляр агрегованого об'єкту (масив)
• Агрегат (стек) має доступ лише до відкритої частини агрегованого об'єкту (масиву)
• Користувачі агрегату (стеку) взагалі не мають доступу до агрегованого об'єкту (масиву)
• При необхідності доступ до агрегованого об'єкту делегується шляхом розширення функціональності агрегату (чи завжди таке розширення функціональності виправдане?)
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
7
Стек з підгляданням
• Розширимо функціональність стеку операцією індексування, делегованою масиву, відповідно змінивши назву класу
© Бублик В.В. Програмування-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;• };
© Бублик В.В. Програмування-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];• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
10
Проблеми
• Не підтримується зв’язок класу PeekBackStackAggregatingArray з класом StackAggregatingArray
• кожна із спільних операцій має власну реалізацію у своєму класі
• При необхідності внесення змін їх доведеться вносити у декілька класів
• Як реагувати на спробу підглянути на неіснуючий елемент стеку?
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
11
Дублювання операцій
• За доступ до масиву платимо дублюванням функціональності стеку
• const Elem& PeekBackStackAggregatingArray::• top() const• {• return _pa[_top];• }
© Бублик В.В. Програмування-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;• };
© Бублик В.В. Програмування-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;• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
14
Успадкування
• Визначимо два зв'язаних між собою класи: один залишиться звичайним стеком, інший стане особливим стеком, доповненим додатковою функціональністю
• Скажемо, що стек з підгляданням суть клас, похідний від стеку, а сам стек базовий клас для стеку з підгляданням
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
15
Формула (відкритого) успадкування
Студент теж людина
• Підоб'єкт успадковує всі властивості (атрибути) і поведінку (відкриті методи) базового об'єкту
• Підоб'єкт може мати власні додаткові властивості і поведінку
• Підоб'єкт не має доступу до закритої частини базового об'єкту
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
16
Відкрите (повне) успадкування. Приклад
• // PeekBackStackAggregatingArray суть повноцінний
• // StackAggregatingArray, але• // з додатковими можливостями
• class PeekBackStackAggregatingArray: public StackAggregatingArray
• {• public:• PeekBackStackAggregatingArray(size_t);• ~ PeekBackStackAggregatingArray();• bool peekback(size_t, Elem &) const;• };
© Бублик В.В. Програмування-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
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
18
Створення похідних об'єктів
• Кожне виконання конструктора похідного класу починається з виклику конструктора базового класу незалежно від того, чи згадано цей виклик у списку ініціалізації (якщо ні, то без параметрів)
• PeekBackStackAggregatingArray::• PeekBackStackAggregatingArray (size_t sz):• // Ініціалізація базового об’єкту• StackAggregatingArray (sz)• {• return;• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
19
Створення похідних об'єктів
• Компілятор виявить помилку, що полягатиме у спробі виклику конструктора за замовчуванням (без параметрів) для базового класу StackAggregatingArray
• PeekBackStackAggregatingArray::• PeekBackStackAggregatingArray (size_t sz)• {• return;• }• Помилки компіляції не буде, якщо
StackAggregatingArray матиме замовчуване значення параметру, але буде серйозна помилка виконання (чому?)
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
20
Видалення похідних об'єктів
• Оскільки атрибути похідних об'єктів можуть посилатися на атрибути базового об'єкту, то спочатку видаляються всі власні компоненти похідного об'єкту, а потім автоматично викликається деструктор
• Базовий об'єкт не знає нічого про свої похідні об'єкти
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
21
Відкрите (повне) успадкування. Діаграма
композиція
успадкуванняСтек з
підгляданням не
одержав доступу до
operator[], який мав стек
© Бублик В.В. Програмування-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;• }
Правила доступу: проблема
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
23
Знову проблема
• Як надати похідному стеку з підгляданням доступ до оператора індексування масиву, агрегованого в базовий стек?
• Можливі варіанти:
1. Включити операцію індексування до відкритої частини стеку ― дуже погано (спотворений стек)
2. Надати підоб'єкту особливі права до закритої частини базового класу ― неможливо
3. Визначити особливі правила доступу похідних класів до базових: protected ― закрите для всіх, крім похідних
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
24
Захищена частина класу
• Додатково до закритої (private), недоступної нікому, і відкритої (public), доступної всім, частин класу визначаємо захищену (protected) частину
• class AnyClass• {• private:• // only for me• protected:• // only for me and my subclasses• public:• // for everyone• }
© Бублик В.В. Програмування-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;• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
26
Стек, спотворений невластивою йому операцією
• Захищений оператор тепер доступний підкласу, але стек залишається спотвореним
© Бублик В.В. Програмування-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;• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
28
Інший вид успадкування
• Як вбудувати масив до стеку так, щоб стек міг передати функціональність масиву своїм похідним класам
• Варіант 1. Зробити стек похідним від масиву. Дуже погано, бо відкриється повний доступ до всіх елементів стеку, в тому числі неіснуючих
• Варіант 2. Розглянути закрите успадкування, тепер підклас одержить доступ не тільки до відкритої, але й до захищеної частини класу
© Бублик В.В. Програмування-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;• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
30
Закрите успадкування (реалізації). Діаграма
• Підклас має доступ до відкритої і захищеної частини базового класу, але не передає цих прав своїм підкласам
• Стек все ще мусить містити “чужу” операцію
© Бублик В.В. Програмування-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];• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
32
Четверта спроба реалізації
• Хоч спосіб реалізації операції індексування у стеку змінився, стек з підгляданням залишився без змін
• bool PeekBackStackAggregatingArray::• peekback(size_t index, Elem & elem) const• {• if (index>_size)• return false;• elem = (*this) [index];• return true;• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
33
Третій вид успадкування
• Розглянемо успадкування, яке захищає базовий клас від стороннього доступу, передаючи права доступу до нього лише власним похідним класам
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
34
Транзитивне (захищене) успадкування
• Підклас передає своїм підкласам доступ до відкритої і захищеної частини базового класу так, як ніби вони складали його захищену частину
• operator[] класу Array одержав статус захищеного оператора класу StackDerivedFromArray
© Бублик В.В. Програмування-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;• };
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
36
Для стеків успадкування залишається відкритим
• // PeekBackStackDerivedFromArray суть повноцінний
• // StackDerivedFromArray, але• // з додатковими правами доступу
• class PeekBackStackDerivedFromArray: public StackDerivedFromArray
• {• public:• PeekBackStackAggregatingArray(size_t);• ~ PeekBackStackAggregatingArray();• bool peekback(size_t, Elem &) const;• };
© Бублик В.В. Програмування-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;• }
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
38
Типи успадкувань
Успадкування лише реалізації• private: відкрита і захищена частини базового
класу може використовуватися в похідному класі
• protected: транзитивне (захищене) ― відкрита і захищена частини базового класу може використовуватися в усіх похідних класах
Успадкування реалізації і поведінки ― public: відкрита частина базового класу стає одночасно відкритою частиною похідного класу
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
39
Порівняння агрегації і успадкування
Агрегація:• Агрегат користується об'єктом виключно сам
Успадкування:• Закрите: похідний об'єкт користується базовим
об'єктом виключно сам• Захищене: похідний об'єкт користується
базовим об'єктом сам і передає ці права своїм похідним об'єктам
• Відкрите: похідний об'єкт користується базовим об'єктом сам і передає ці права своїм похідним об'єктам і клієнтам
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
40
Порівняння рішень для стеку: агрегація
• Дуже добре рішення: стек має повний доступ до масиву, але приховує його
• При агрегації указником можлива кратна динамічна агрегація
• Проблема: делегування доступу похідним класам
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
41
Порівняння рішень для стеку:закрите успадкування (реалізації)
• Стек має повний доступ до масиву і приховує його
• Повністю статична структура: при будь-якій зміні в масиві всі похідні класи перекомпільовуються
• При використанні захищеного успадкування доступ транзитивно передається підкласам
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
42
Порівняння рішень для стеку:захищене (транзитивне) успадкування
(реалізації)• Стек має повний
доступ до масиву і приховує його
• Повністю статична структура: при будь-якій зміні в масиві всі похідні класи перекомпільовуються
• При використанні захищеного успадкування доступ транзитивно передається підкласам
© Бублик В.В. Програмування-2. Об'єктне програмування. Ієрархія об’єктів і ієрархія класів
43
Висновок
• Успадкування реалізації і агрегація мають спільні риси: віддаємо перевагу агрегації, якщо не виникає потреба транзитивно делегувати доступ до “захованого” класу