09 Object And Class Hierarchy

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    09 Object And Class Hierarchy - Presentation 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[] , який мав стек
      • Похідний клас (стек з підгляданням) тепер втратив доступ до закритої частини базового класу (масиву)
      • bool PeekBack StackAggregatingArray::
      • peekback(size_t index, Elem & elem) const
      • {
      • if (index>_size)
      • return false ;
      • // delegate indexing to Array
      • elem = _pa[index];
      • return true ;
      • }
      Правила доступу: проблема
    22. Знову проблема
      • Як надати похідному стеку з підгляданням доступ до оператора індексування масиву, агрегованого в базовий стек?
      • Можливі варіанти:
      • Включити операцію індексування до відкритої частини стеку ― дуже погано (спотворений стек)
      • Надати підоб'єкту особливі права до закритої частини базового класу ― неможливо
      • Визначити особливі правила доступу похідних класів до базових: protected ― закрите для всіх, крім похідних
    23. Захищена частина класу
      • Додатково до закритої ( private ), недоступної нікому, і відкритої ( public ), доступної всім, частин класу визначаємо захищену ( protected ) частину
      • class AnyClass
      • {
      • private :
      • // only for me
      • protected :
      • // only for me and my subclasses
      • public :
      • // for everyone
      • }
    24. Все ще не дуже вдалий проект: захищений метод
      • 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;
      • };
    25. Стек, спотворений невластивою йому операцією
      • Захищений оператор тепер доступний підкласу, але стек залишається спотвореним
    26. Третя спроба реалізації
      • // 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 ;
      • }
    27. Інший вид успадкування
      • Як вбудувати масив до стеку так, щоб стек міг передати функціональність масиву своїм похідним класам
      • Варіант 1. Зробити стек похідним від масиву. Дуже погано, бо відкриється повний доступ до всіх елементів стеку, в тому числі неіснуючих
      • Варіант 2. Розглянути закрите успадкування, тепер підклас одержить доступ не тільки до відкритої, але й до захищеної частини класу
    28. Закрите успадкування (реалізації)
      • 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;
      • };
    29. Закрите успадкування (реалізації). Діаграма
      • Підклас має доступ до відкритої і захищеної частини базового класу, але не передає цих прав своїм підкласам
      • Стек все ще мусить містити “ чужу ” операцію
    30. Заміна реалізації захищеного методу
      • Проект все ще не дуже вдалий, оскільки стек продовжує містити невластиву йому операцію, правда, реалізовану в інший спосіб
      • const Elem& StackDerivedFromArray::
      • operator [] (size_t index) const
      • {
      • // delegate indexing to its base class Array
      • // and transmit it to PeekBackStack
      • return (* this ) [index];
      • }
    31. Четверта спроба реалізації
      • Хоч спосіб реалізації операції індексування у стеку змінився, стек з підгляданням залишився без змін
      • bool PeekBack StackAggregatingArray::
      • peekback(size_t index, Elem & elem) const
      • {
      • if (index>_size)
      • return false ;
      • elem = (* this ) [index];
      • return true ;
      • }
    32. Третій вид успадкування
      • Розглянемо успадкування, яке захищає базовий клас від стороннього доступу, передаючи права доступу до нього лише власним похідним класам
    33. Транзитивне (захищене) успадкування
      • Підклас передає своїм підкласам доступ до відкритої і захищеної частини базового класу так, як ніби вони складали його захищену частину
      • operator [] класу Array одержав статус захищеного оператора класу StackDerivedFromArray
    34. Транзитивне успадкування реалізації
      • 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;
      • };
    35. Для стеків успадкування залишається відкритим
      • // PeekBack StackDerivedFromArray суть повноцінний
      • // StackDerivedFromArray , але
      • // з додатковими правами доступу
      • class PeekBack StackDerivedFromArray : public StackDerivedFromArray
      • {
      • public :
      • PeekBack StackAggregatingArray ( size_t );
      • ~ PeekBack StackAggregatingArray ();
      • bool peekback(size_t, Elem &) const ;
      • };
    36. П'ята (остаточна) спроба реалізації
      • Доступ до самого масиву
      • 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 ;
      • }
    37. Типи успадкувань
      • Успадкування лише реалізації
      • private : відкрита і захищена частини базового класу може використовуватися в похідному класі
      • protected : транзитивне (захищене) ― відкрита і захищена частини базового класу може використовуватися в усіх похідних класах
      • Успадкування реалізації і поведінки ― public : відкрита частина базового класу стає одночасно відкритою частиною похідного класу
    38. Порівняння агрегації і успадкування
      • Агрегація:
      • Агрегат користується об'єктом виключно сам
      • Успадкування:
      • Закрите: похідний об'єкт користується базовим об'єктом виключно сам
      • Захищене: похідний об'єкт користується базовим об'єктом сам і передає ці права своїм похідним об'єктам
      • Відкрите: похідний об'єкт користується базовим об'єктом сам і передає ці права своїм похідним об'єктам і клієнтам
    39. Порівняння рішень для стеку: агрегація
      • Дуже добре рішення: стек має повний доступ до масиву, але приховує його
      • При агрегації указником можлива кратна динамічна агрегація
      • Проблема: делегування доступу похідним класам
    40. Порівняння рішень для стеку: закрите успадкування (реалізації)
      • Стек має повний доступ до масиву і приховує його
      • Повністю статична структура: при будь-якій зміні в масиві всі похідні класи перекомпільовуються
      • При використанні захищеного успадкування доступ транзитивно передається підкласам
    41. Порівняння рішень для стеку: захищене (транзитивне) успадкування (реалізації)
      • Стек має повний доступ до масиву і приховує його
      • Повністю статична структура: при будь-якій зміні в масиві всі похідні класи перекомпільовуються
      • При використанні захищеного успадкування доступ транзитивно передається підкласам
    42. Висновок
      • Успадкування реалізації і агрегація мають спільні риси: віддаємо перевагу агрегації, якщо не виникає потреба транзитивно делегувати доступ до “ захованого ” класу

    + olegapsterolegapster, 7 months ago

    custom

    97 views, 0 favs, 0 embeds more stats

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 97
      • 97 on SlideShare
      • 0 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 0
    Most viewed embeds

    more

    All embeds

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories