Одиночне і множинне спадкування

У мові Java новий клас може розширювати всього один суперклас – така модель має назву одиночного наслідування Розширення класу означає, що новий клас успадковує від свого суперкласу не тільки контракт, але і реалізацію У деяких обєктно-орієнтованих мовах використовується множинне спадкування, при якому новий клас може мати два і більше суперкласів

Множинне успадкування виявляється корисним в тих випадках, коли потрібно наділити клас новими можливостями і при цьому зберегти більшу частину (або всі) старих властивостей Однак при наявності декількох суперкласів виникають проблеми, повязані з двоїстим спадкуванням Наприклад, розглянемо наступну ієрархію типів:

Зазвичай така ситуація називається ромбоподібним спадкуванням, і в ній немає нічого поганого – подібна структура зустрічається досить часто Проблема полягає у спадкуванні реалізації Якщо клас W містить відкрите поле goggin і у вас є посилання на обєкт типу Z з імям zref, то чому буде відповідати посилання zrefgoggin Чи буде вона представляти собою копію goggin з класу X, або з класу Y, або ж X і Y будуть використовувати одну копію goggin, оскільки насправді W входить в Z всього один раз, хоча Z одночасно є і X, і Y

Щоб уникнути подібних проблем, в Java використовується обєктно-орієнтована модель з одиночним спадкуванням

Одиночне спадкування сприяє правильному проектування Проблеми множинного спадкоємства виникають з розширення класів при їх реалізації Тому Java надає можливість наслідування контракту без повязаної з ним реалізації Для цього замість типу class використовується тип interface

Таким чином, інтерфейси входять в ієрархію класів і наділяють Java можливостями множинного успадкування

Класи, які розгортаються, даним класом, і реалізовані їм інтерфейси спільно називаються його супертіпа з точки зору супертіпа, новий клас є підтипом У поняття повного типу нового класу входять всі його супертіпи, тому посилання на обєкт класу може використовуватися поліморфно – тобто всюди, де повинна знаходитися посилання на обєкт будь-якого з супертіпа (Класу або інтерфейсу) Визначення інтерфейсів створюють імена типів, подібно тому як це відбувається з

іменами класів ви можете використовувати імя інтерфейсу в якості імені змінної і присвоїти їй будь-який обєкт, який реалізує даний інтерфейс

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*