Бублик Володимир Васильович Програмування - 2 Лекція  9 . Об'єктне програмування. Ієрархія об’єктів і ієрархія класів    Л...
Повторення: масив, агрегований в стек  <ul><li>// Назва класу підкреслює спосіб організації ієрархії </li></ul><ul><li>cla...
Зауваження <ul><li>Все, про що йтиметься в лекції, дослівно переноситься на випадок параметризованих класів </li></ul><ul>...
Стек агрегує масив <ul><li>class  StackAggregatingArray </li></ul><ul><li>{ </li></ul><ul><li>public : </li></ul><ul><li>S...
Агрегований масив <ul><li>class  Array </li></ul><ul><li>{ </li></ul><ul><li>public : </li></ul><ul><li>Array ( size_t ); ...
Властивості агрегації <ul><li>Кожен агрегат (стек) містить в собі екземпляр агрегованого об'єкту (масив) </li></ul><ul><li...
Стек з підгляданням <ul><li>Розширимо функціональність стеку операцією індексування, делегованою масиву, відповідно змінив...
Стек з підгляданням <ul><li>class   PeekBack StackAggregatingArray </li></ul><ul><li>{ </li></ul><ul><li>public : </li></u...
Спроба реалізації (невдала) <ul><li>// Between bad and very bad </li></ul><ul><li>const int &   PeekBack StackAggregatingA...
Проблеми <ul><li>Не підтримується зв’язок класу  PeekBackStackAggregatingArray  з класом  StackAggregatingArray </li></ul>...
Дублювання операцій <ul><li>За доступ до масиву платимо дублюванням функціональності стеку </li></ul><ul><li>const  Elem& ...
Акуратніше підглядання <ul><li>class   PeekBack StackAggregatingArray </li></ul><ul><li>{ </li></ul><ul><li>public : </li>...
Друга спроба реалізації <ul><li>// Between bad and fair </li></ul><ul><li>bool   PeekBack StackAggregatingArray:: </li></u...
Успадкування <ul><li>Визначимо два зв'язаних між собою класи: один залишиться звичайним стеком, інший стане особливим стек...
Формула (відкритого) успадкування <ul><li>Студент теж людина </li></ul><ul><li>Підоб'єкт успадковує всі властивості (атриб...
Відкрите (повне) успадкування. Приклад <ul><li>// PeekBack StackAggregatingArray  суть повноцінний </li></ul><ul><li>// St...
Правила доступу при успадкуванні (будь-якому) <ul><li>Клієнт похідного класу має повний доступ до відкритої частини як баз...
Створення похідних об'єктів <ul><li>Кожне виконання конструктора похідного класу починається з виклику конструктора базово...
Створення похідних об'єктів <ul><li>Компілятор виявить помилку, що полягатиме у спробі виклику конструктора за замовчуванн...
Видалення похідних об'єктів <ul><li>Оскільки атрибути похідних об'єктів можуть посилатися на атрибути базового об'єкту, то...
Відкрите (повне) успадкування. Діаграма композиція успадкування Стек з підгляданням не одержав доступу до  operato r[] , я...
<ul><li>Похідний клас (стек з підгляданням) тепер втратив доступ до закритої частини базового класу (масиву) </li></ul><ul...
Знову проблема <ul><li>Як надати похідному стеку з підгляданням доступ до оператора індексування масиву, агрегованого в ба...
Захищена частина класу <ul><li>Додатково до закритої ( private ), недоступної нікому, і відкритої ( public ), доступної вс...
Все ще не дуже вдалий проект: захищений метод <ul><li>class  StackAggregatingArray </li></ul><ul><li>{ </li></ul><ul><li>p...
Стек, спотворений невластивою йому операцією <ul><li>Захищений оператор тепер доступний підкласу, але стек залишається спо...
Третя спроба реалізації <ul><li>// Still not very good </li></ul><ul><li>bool   PeekBack StackAggregatingArray:: </li></ul...
Інший вид успадкування <ul><li>Як вбудувати масив до стеку так, щоб стек міг передати функціональність масиву своїм похідн...
Закрите успадкування (реалізації) <ul><li>class  StackAggregatingArray   :  private  Array </li></ul><ul><li>{ </li></ul><...
Закрите успадкування (реалізації). Діаграма <ul><li>Підклас має доступ до відкритої і захищеної частини базового класу, ал...
Заміна реалізації захищеного методу  <ul><li>Проект все ще не дуже вдалий, оскільки стек продовжує містити невластиву йому...
Четверта спроба реалізації <ul><li>Хоч спосіб реалізації операції індексування у стеку змінився, стек з підгляданням залиш...
Третій вид успадкування <ul><li>Розглянемо успадкування, яке захищає базовий клас від стороннього доступу, передаючи права...
Транзитивне (захищене) успадкування <ul><li>Підклас передає своїм підкласам доступ до відкритої і захищеної частини базово...
Транзитивне успадкування реалізації <ul><li>class  StackDerivedFromArray   :  protected  Array </li></ul><ul><li>{ </li></...
Для стеків успадкування залишається відкритим <ul><li>// PeekBack StackDerivedFromArray  суть повноцінний </li></ul><ul><l...
П'ята (остаточна) спроба реалізації <ul><li>Доступ до самого масиву </li></ul><ul><li>bool   PeekBack StackDerivedFromArra...
Типи успадкувань <ul><li>Успадкування лише реалізації </li></ul><ul><li>private : відкрита і захищена частини базового кла...
Порівняння агрегації і успадкування <ul><li>Агрегація: </li></ul><ul><li>Агрегат користується об'єктом виключно сам </li><...
Порівняння рішень для стеку: агрегація <ul><li>Дуже добре рішення: стек має повний доступ до масиву, але приховує його </l...
Порівняння рішень для стеку: закрите успадкування (реалізації) <ul><li>Стек має повний доступ до масиву і приховує його </...
Порівняння рішень для стеку: захищене (транзитивне) успадкування (реалізації) <ul><li>Стек має повний доступ до масиву і п...
Висновок <ul><li>Успадкування реалізації і агрегація мають спільні риси: віддаємо перевагу агрегації, якщо не виникає потр...
Upcoming SlideShare
Loading in …5
×

09 Object And Class Hierarchy

447 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
447
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

09 Object And Class Hierarchy

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

×