Your SlideShare is downloading. ×
09 Object And Class Hierarchy
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

09 Object And Class Hierarchy

251
views

Published on

Published in: Technology, Business

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
251
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Бублик Володимир Васильович Програмування - 2 Лекція 9 . Об'єктне програмування. Ієрархія об’єктів і ієрархія класів Лекції для студентів 2 курсу
  • 2. Повторення: масив, агрегований в стек
    • // Назва класу підкреслює спосіб організації ієрархії
    • class Stack Aggregating Array ;
  • 3. Зауваження
    • Все, про що йтиметься в лекції, дослівно переноситься на випадок параметризованих класів
    • З метою спрощення позначень працюватимемо з простими класами, позначивши тип елемента через Elem і не вдаючись в деталі, як він визначається (через typedef чи template )
    • Вправа . Розповсюдьте приклади лекції на параметризовані класи
  • 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 ;
    • };
  • 5. Агрегований масив
    • class Array
    • {
    • public :
    • Array ( size_t );
    • ~Array();
    • private :
    • Elem * _pa;
    • size_t _size;
    • Elem& operator [] (size_t);
    • const Elem& operator [] (size_t) const ;
    • };
  • 6. Властивості агрегації
    • Кожен агрегат (стек) містить в собі екземпляр агрегованого об'єкту (масив)
    • Агрегат (стек) має доступ лише до відкритої частини агрегованого об'єкту (масиву)
    • Користувачі агрегату (стеку) взагалі не мають доступу до агрегованого об'єкту (масиву)
    • При необхідності доступ до агрегованого об'єкту делегується шляхом розширення функціональності агрегату (чи завжди таке розширення функціональності виправдане?)
  • 7. Стек з підгляданням
    • Розширимо функціональність стеку операцією індексування, делегованою масиву, відповідно змінивши назву класу
  • 8. Стек з підгляданням
    • class PeekBack StackAggregatingArray
    • {
    • 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;
    • };
  • 9. Спроба реалізації (невдала)
    • // Between bad and very bad
    • const int & PeekBack StackAggregatingArray::
    • operator [] (size_t index) const
    • {
    • if (index>_size)
    • // throw do not know what to do
    • // else delegate indexing to Array
    • return _pa[index];
    • }
  • 10. Проблеми
    • Не підтримується зв’язок класу PeekBackStackAggregatingArray з класом StackAggregatingArray
    • кожна із спільних операцій має власну реалізацію у своєму класі
    • При необхідності внесення змін їх доведеться вносити у декілька класів
    • Як реагувати на спробу підглянути на неіснуючий елемент стеку?
  • 11. Дублювання операцій
    • За доступ до масиву платимо дублюванням функціональності стеку
    • const Elem& PeekBack StackAggregatingArray::
    • top() const
    • {
    • return _pa[_top];
    • }
  • 12. Акуратніше підглядання
    • class PeekBack StackAggregatingArray
    • {
    • public :
    • PeekBack StackAggregatingArray ( size_t );
    • ~ PeekBack StackAggregatingArray ();
    • 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;
    • };
  • 13. Друга спроба реалізації
    • // Between bad and fair
    • bool PeekBack StackAggregatingArray::
    • peekback(size_t index, Elem & elem) const
    • {
    • if (index>_size)
    • return false ;
    • // delegate indexing to Array
    • elem = _pa[index];
    • return true ;
    • }
  • 14. Успадкування
    • Визначимо два зв'язаних між собою класи: один залишиться звичайним стеком, інший стане особливим стеком, доповненим додатковою функціональністю
    • Скажемо, що стек з підгляданням суть клас, похідний від стеку, а сам стек базовий клас для стеку з підгляданням
  • 15. Формула (відкритого) успадкування
    • Студент теж людина
    • Підоб'єкт успадковує всі властивості (атрибути) і поведінку (відкриті методи) базового об'єкту
    • Підоб'єкт може мати власні додаткові властивості і поведінку
    • Підоб'єкт не має доступу до закритої частини базового об'єкту
  • 16. Відкрите (повне) успадкування. Приклад
    • // PeekBack StackAggregatingArray суть повноцінний
    • // StackAggregatingArray , але
    • // з додатковими можливостями
    • class PeekBack StackAggregatingArray : public StackAggregatingArray
    • {
    • public :
    • PeekBack StackAggregatingArray ( size_t );
    • ~ PeekBack StackAggregatingArray ();
    • bool peekback(size_t, Elem &) const ;
    • };
  • 17. Правила доступу при успадкуванні (будь-якому)
    • Клієнт похідного класу має повний доступ до відкритої частини як базового, так і похідного класу
    • PeekBack StackAggregatingArray s(100);
    • // повна поведінка стеку
    • s.push(10);
    • cout<<s.top();
    • int peeked;
    • if (s.peekback(2, peeked))
    • cout<< peeked;
    • // s.peekback(10, peeked) == false
  • 18. Створення похідних об'єктів
    • Кожне виконання конструктора похідного класу починається з виклику конструктора базового класу незалежно від того, чи згадано цей виклик у списку ініціалізації (якщо ні, то без параметрів)
    • PeekBack StackAggregatingArray::
    • PeekBack StackAggregatingArray (size_t sz):
    • // Ініціалізація базового об ’ єкту
    • StackAggregatingArray (sz)
    • {
    • return ;
    • }
  • 19. Створення похідних об'єктів
    • Компілятор виявить помилку, що полягатиме у спробі виклику конструктора за замовчуванням (без параметрів) для базового класу StackAggregatingArray
    • PeekBack StackAggregatingArray::
    • PeekBack StackAggregatingArray (size_t sz)
    • {
    • return ;
    • }
    • Помилки компіляції не буде, якщо StackAggregatingArray матиме замовчуване значення параметру, але буде серйозна помилка виконання (чому?)
  • 20. Видалення похідних об'єктів
    • Оскільки атрибути похідних об'єктів можуть посилатися на атрибути базового об'єкту, то спочатку видаляються всі власні компоненти похідного об'єкту, а потім автоматично викликається деструктор
    • Базовий об'єкт не знає нічого про свої похідні об'єкти
  • 21. Відкрите (повне) успадкування. Діаграма композиція успадкування Стек з підгляданням не одержав доступу до operato r[] , який мав стек
  • 22.
    • Похідний клас (стек з підгляданням) тепер втратив доступ до закритої частини базового класу (масиву)
    • bool PeekBack StackAggregatingArray::
    • peekback(size_t index, Elem & elem) const
    • {
    • if (index>_size)
    • return false ;
    • // delegate indexing to Array
    • elem = _pa[index];
    • return true ;
    • }
    Правила доступу: проблема
  • 23. Знову проблема
    • Як надати похідному стеку з підгляданням доступ до оператора індексування масиву, агрегованого в базовий стек?
    • Можливі варіанти:
    • Включити операцію індексування до відкритої частини стеку ― дуже погано (спотворений стек)
    • Надати підоб'єкту особливі права до закритої частини базового класу ― неможливо
    • Визначити особливі правила доступу похідних класів до базових: protected ― закрите для всіх, крім похідних
  • 24. Захищена частина класу
    • Додатково до закритої ( private ), недоступної нікому, і відкритої ( public ), доступної всім, частин класу визначаємо захищену ( protected ) частину
    • class AnyClass
    • {
    • private :
    • // only for me
    • protected :
    • // only for me and my subclasses
    • public :
    • // for everyone
    • }
  • 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;
    • };
  • 26. Стек, спотворений невластивою йому операцією
    • Захищений оператор тепер доступний підкласу, але стек залишається спотвореним
  • 27. Третя спроба реалізації
    • // Still not very good
    • bool PeekBack StackAggregatingArray::
    • peekback(size_t index, Elem & elem) const
    • {
    • if (index>_size)
    • return false ;
    • // inherited protected operator from a base class
    • elem = (* this ) [index];
    • return true ;
    • }
  • 28. Інший вид успадкування
    • Як вбудувати масив до стеку так, щоб стек міг передати функціональність масиву своїм похідним класам
    • Варіант 1. Зробити стек похідним від масиву. Дуже погано, бо відкриється повний доступ до всіх елементів стеку, в тому числі неіснуючих
    • Варіант 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;
    • };
  • 30. Закрите успадкування (реалізації). Діаграма
    • Підклас має доступ до відкритої і захищеної частини базового класу, але не передає цих прав своїм підкласам
    • Стек все ще мусить містити “ чужу ” операцію
  • 31. Заміна реалізації захищеного методу
    • Проект все ще не дуже вдалий, оскільки стек продовжує містити невластиву йому операцію, правда, реалізовану в інший спосіб
    • const Elem& StackDerivedFromArray::
    • operator [] (size_t index) const
    • {
    • // delegate indexing to its base class Array
    • // and transmit it to PeekBackStack
    • return (* this ) [index];
    • }
  • 32. Четверта спроба реалізації
    • Хоч спосіб реалізації операції індексування у стеку змінився, стек з підгляданням залишився без змін
    • bool PeekBack StackAggregatingArray::
    • peekback(size_t index, Elem & elem) const
    • {
    • if (index>_size)
    • return false ;
    • elem = (* this ) [index];
    • return true ;
    • }
  • 33. Третій вид успадкування
    • Розглянемо успадкування, яке захищає базовий клас від стороннього доступу, передаючи права доступу до нього лише власним похідним класам
  • 34. Транзитивне (захищене) успадкування
    • Підклас передає своїм підкласам доступ до відкритої і захищеної частини базового класу так, як ніби вони складали його захищену частину
    • operator [] класу Array одержав статус захищеного оператора класу StackDerivedFromArray
  • 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;
    • };
  • 36. Для стеків успадкування залишається відкритим
    • // PeekBack StackDerivedFromArray суть повноцінний
    • // StackDerivedFromArray , але
    • // з додатковими правами доступу
    • class PeekBack StackDerivedFromArray : public StackDerivedFromArray
    • {
    • public :
    • PeekBack StackAggregatingArray ( size_t );
    • ~ PeekBack StackAggregatingArray ();
    • bool peekback(size_t, Elem &) const ;
    • };
  • 37. П'ята (остаточна) спроба реалізації
    • Доступ до самого масиву
    • bool PeekBack StackDerivedFromArray::
    • peekback(size_t index, Elem & elem) const
    • {
    • if (index>_size)
    • return false ;
    • // Now direct operator[] from Array
    • elem = (* this ) [index];
    • return true ;
    • }
  • 38. Типи успадкувань
    • Успадкування лише реалізації
    • private : відкрита і захищена частини базового класу може використовуватися в похідному класі
    • protected : транзитивне (захищене) ― відкрита і захищена частини базового класу може використовуватися в усіх похідних класах
    • Успадкування реалізації і поведінки ― public : відкрита частина базового класу стає одночасно відкритою частиною похідного класу
  • 39. Порівняння агрегації і успадкування
    • Агрегація:
    • Агрегат користується об'єктом виключно сам
    • Успадкування:
    • Закрите: похідний об'єкт користується базовим об'єктом виключно сам
    • Захищене: похідний об'єкт користується базовим об'єктом сам і передає ці права своїм похідним об'єктам
    • Відкрите: похідний об'єкт користується базовим об'єктом сам і передає ці права своїм похідним об'єктам і клієнтам
  • 40. Порівняння рішень для стеку: агрегація
    • Дуже добре рішення: стек має повний доступ до масиву, але приховує його
    • При агрегації указником можлива кратна динамічна агрегація
    • Проблема: делегування доступу похідним класам
  • 41. Порівняння рішень для стеку: закрите успадкування (реалізації)
    • Стек має повний доступ до масиву і приховує його
    • Повністю статична структура: при будь-якій зміні в масиві всі похідні класи перекомпільовуються
    • При використанні захищеного успадкування доступ транзитивно передається підкласам
  • 42. Порівняння рішень для стеку: захищене (транзитивне) успадкування (реалізації)
    • Стек має повний доступ до масиву і приховує його
    • Повністю статична структура: при будь-якій зміні в масиві всі похідні класи перекомпільовуються
    • При використанні захищеного успадкування доступ транзитивно передається підкласам
  • 43. Висновок
    • Успадкування реалізації і агрегація мають спільні риси: віддаємо перевагу агрегації, якщо не виникає потреба транзитивно делегувати доступ до “ захованого ” класу

×