Page 75 - 4836
P. 75
телефон, але він має також всю функціональність годин).
Дуже зручно просто успадкувати клас Cellular від класів Clock
і Phone. По-перше, програмісту не доводиться заново
переписувати численні методи. По-друге, зберігаються всі
переваги поліморфізму: об'єкт класу Cellular можна
використовувати в програмі і як годину (як об'єкт класу Clock
) і як телефон (як об'єкт класу Phone) .
Однак множинне наслідування потенційно здатне
породити важковирішувані проблеми. Вони починаються,
коли у класів - предків є методи з однаковими сигнатурами
(тобто ім'ям і числом параметрів).
Наприклад, у класі Clock є метод ring( ), який
викликається, коли спрацьовує таймер будильника. Але в
класі Phone теж є метод ring( ) , який викликається, коли хтось
телефонує і треба сповістити про це власника. Коли клас
Cellular успадковує від класів Clock і Phone , він отримує
метод ring( ). Але який з його варіантів ?
У цій ситуації немає бездоганного рішення. Тому
багато мов програмування забороняють множинне
спадкування.
Java множинне спадкування не підтримує.
Зауважимо, однак, що якщо метод ring( ) хоча б в
одному з класів Clock і Phone є абстрактним, то конфлікту
виникнути не може. Абстрактний метод не має реалізації, а
отже, «перемагає» той метод, який абстрактним не є. Якщо ж
метод є абстрактним в обох класах, він залишиться таким ж
самим і в їх нащадку.
Використовуючи цю особливість абстрактних класів,
автори мови Java ввели в нього особливу конструкцію -
інтерфейси, що дозволяють зберегти частину переваг
множинного наслідування (а саме - переваги поліморфізму),
уникнувши при цьому головної проблеми множинного
наслідування.
73