Page 88 - 4190
P. 88
тинне успадкування реалізації або класу апроксимується за допомо-
гою закритого успадкування.
Під успадкуванням вважається тільки успадкування реалізації.
Змінній можна присвоїти екземпляри будь-якого класу за умови, що
вони підтримують операції, що виконуються над значеннями цієї
змінної. Хоча в більшості мов програмування відмінність між успад-
куванням інтерфейсу і реалізації не підтримується, на практиці воно
існує. Програмісти, що працюють мовою Smalltalk вважають, що під-
класи – це підтипи (хоча є і добре відомі винятки). Програмісти, що
працюють мовою C++ маніпулюють об’єктами через класи, які ви-
значаються абстрактними класами. Тому багато патернів проектуван-
ня залежать від цих відмінностей. Наприклад, об’єкти, що побудовані
з патерном ланцюжок обов’язків, повинні мати загальний тип, але їх
реалізації, як правило, різні. У патерні компоновник окремий об’єкт
(компонент) визначає загальний інтерфейс, але реалізацію часто ви-
значає окремий складовий об’єкт (композиція). Патерни Команда,
Спостерігач, стан і Стратегія часто реалізуються абстрактними кла-
сами з винятково внутрішніми функціями.
Програмування з інтерфейсом, а не з реалізацією. Успадку-
вання класів – це не що інше, як механізм розширення функціональ-
ності додатку шляхом повторного використання функціональності
батьківських класів. Воно дозволяє швидко визначити новий вид
об’єктів у термінах, того що є в наявності. Нову реалізацію можна
отримати шляхом успадкування більшої частини необхідного коду з
раніше написаних класів.
Але не менш важливим є те, що успадкування дозволяє визначи-
ти сімейства об’єктів з ідентичними інтерфейсами (як правило, за-
вдяки успадкуванню абстрактних класів). Тому що від цього зале-
жить поліморфізм.
Якщо користуватися успадкуванням обережно (або правильно),
то усі класи, що є похідними від деякого абстрактного класу, будуть
мати його інтерфейс. Звідси випливає, що підклас додає нові або за-
міщає старі операції і не приховує операції, що визначені в батьківсь-
кому класі. Усі підкласи можуть відповідати на запити, що відпові-
дають інтерфейсу абстрактного класу, тому вони є підтипами цього
абстрактного класу, на запити батьківського класу.
У маніпулюванні об’єктами строго через інтерфейс абстрактного
класу є дві переваги:
1) клієнтові не потрібно мати інформацію про конкретні типи
88