Page 61 - 4636
P. 61

Перевизначення
           У цій лекції ми розглянули підклас, в якому оголошуються нові атрибути і операції. Допустимо, а
        іноді  і  корисно,  повторно  оголошувати  раніше  оголошені  атрибути  і  операції.  Це  можна  робити  з
        метою присвоєння атрибуту у підкласі значення, яке відрізняється від значення за замовчуванням того
        ж  атрибута  в  суперкласі,  або  для  надання  одній  з  операцій  підкласу  функціональних  можливостей,
        відмінних від функціональних можливостей тієї ж операції в суперкласі. Згаданий процес носить назву
        перевизначення (overriding). Розглянемо, наприклад, клас А з таким визначенням:
           class А {
           public $attribute="Значення позамовчуванню";
           functionoperation () {
           echo "Щось тут таке <br/>";
           echo "Значенням \$attribute є".$this->attribute."<br />";
           }}
           Необхідно  змінити  значення  атрибута  $attribute,  призначене  за  замовчуванням,  і  наділити
        операції  operation()  новими  функціональними  можливостями.  Для  цього  можна  створити
        показаний нижче клас, в якому перевизначаються атрибут $attribute і операція operation ():
           classB extends А {
           public $attribute = "інше значення";
           function operation () {
           echo "А тут щось інше<br/>";
           echo "Значенням \$атрибута є ". $this->атрибут. "<br />";}}
           Оголошення класу В не впливає на вихідне визначення класу А. Розглянемо такі два рядки коду:
           $а = new А() ;
           $а -> operation () ;
           Ці рядки створюють об'єкт типу А і викликають його функцію operation (). У результаті виходить
        такий висновок: Значенням $attribute є значення за замовчуванням доводить відсутність впливу класу
        В на клас А. Створивши об'єкт типу В, отримаємо інший висновок. Наступний код:
           $b = newB() ;
           $b ->operation () ;
        генерує такий висновок: Значенням $attribute є інше значення.
         Як  оголошення  нових  атрибутів  або  операцій  у  підкласі  не  чинить  впливу  на  суперклас,  так  і
        перевизначення атрибутів або операцій у підкласі не чинить впливу на суперклас. Підклас успадковує
        всі  атрибути  і  операції  свого  суперкласу,  якщо  ви  не  передбачаєте  їх  заміни.  Якщо  ви  визначаєте
        заміну,  вона  має  більший  пріоритет  і  перевизначає  початкове  визначення.Ключове  слово  parent
        дозволяє звертатися до початкової версії операції в батьківському класі. Наприклад, для виклику : :
        operation() всередині класу застосовується наступний код:
           parent::operation() ;
           Висновок, однак,  буде  іншим.  Незважаючи  на  те  що викликається  операція  батьківського класу,
        РНР використовує значення атрибутів з поточного класу. Таким чином, висновок виходить наступним:
        Значенням $attribute є інше значення. Спадкування може досягати декількох рівнів у глибину. Можна
        оголосити клас, скажімо, C, який розширює клас B і, отже, успадковує властивості класу та класу А,
        батьківського щодо класу B. У класі C можна також вибірково перевизначати і замінювати атрибути і
        операції, успадковані від батьківських класів.
           Запобігання спадкування і перевизначення з допомогою final
           У  РНР  є  ключове  слово  final.  Коли  це  слово  використовується  перед  оголошенням  функції,  цю
        функцію не може бути перевизначено в жодному підкласі.
           Щоб проілюструвати це, додамо final код класу А з попереднього прикладу:
           class А {public $attribute = 'значення за замовчуванням’;final function
           operation() {
           echo 'Що тут таке<Ьг />';echo "Значенням \$attribute є " .$this-
           >attribute."<br />";}}

                                                            58
   56   57   58   59   60   61   62   63   64   65   66