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
   70   71   72   73   74   75   76   77   78   79   80