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