Page 88 - 4190
P. 88

тинне успадкування реалізації або класу апроксимується за допомо-
            гою закритого успадкування.
                  Під  успадкуванням  вважається  тільки  успадкування  реалізації.
            Змінній можна присвоїти екземпляри будь-якого класу за умови, що

            вони  підтримують  операції,  що  виконуються  над  значеннями  цієї
            змінної. Хоча в більшості мов програмування відмінність між успад-
            куванням інтерфейсу і реалізації не підтримується, на практиці воно

            існує. Програмісти, що працюють мовою Smalltalk вважають, що під-
            класи – це підтипи (хоча є і добре відомі винятки). Програмісти, що
            працюють  мовою  C++  маніпулюють  об’єктами  через  класи,  які  ви-
            значаються абстрактними класами. Тому багато патернів проектуван-

            ня залежать від цих відмінностей. Наприклад, об’єкти, що побудовані
            з патерном ланцюжок обов’язків, повинні мати загальний тип, але їх
            реалізації, як правило, різні. У патерні компоновник окремий об’єкт

            (компонент) визначає загальний інтерфейс, але реалізацію часто ви-
            значає  окремий  складовий  об’єкт  (композиція).  Патерни  Команда,
            Спостерігач,  стан  і Стратегія  часто  реалізуються  абстрактними  кла-

            сами з винятково внутрішніми функціями.
                  Програмування  з  інтерфейсом,  а  не  з  реалізацією.  Успадку-
            вання класів – це не що інше, як механізм розширення функціональ-

            ності    додатку  шляхом  повторного  використання  функціональності
            батьківських  класів.  Воно  дозволяє  швидко  визначити  новий  вид
            об’єктів  у  термінах,  того  що  є  в  наявності.  Нову  реалізацію  можна
            отримати шляхом успадкування більшої частини необхідного коду з

            раніше написаних класів.
                  Але не менш важливим є те, що успадкування дозволяє визначи-
            ти  сімейства  об’єктів  з  ідентичними  інтерфейсами  (як  правило,  за-

            вдяки  успадкуванню  абстрактних  класів).  Тому  що  від  цього  зале-
            жить поліморфізм.
                  Якщо  користуватися  успадкуванням  обережно  (або  правильно),
            то усі класи, що є похідними від деякого абстрактного класу, будуть

            мати його інтерфейс.  Звідси випливає, що підклас додає нові  або за-
            міщає старі операції і не приховує операції, що визначені в батьківсь-
            кому класі. Усі підкласи можуть відповідати на запити,  що відпові-

            дають інтерфейсу абстрактного класу, тому вони є підтипами цього
            абстрактного класу, на запити батьківського класу.
                  У маніпулюванні об’єктами строго через інтерфейс абстрактного

            класу є дві переваги:
                  1)  клієнтові  не  потрібно  мати  інформацію  про  конкретні  типи

                                                              88
   83   84   85   86   87   88   89   90   91   92   93