Sobes.tech
Junior

Можеш ли да говориш о принципима наслеђивања у објектно-оријентисаном програмирању?

sobes.tech АИ

Одговор од АИ

Наслеђивање омогућава креирање нове класе (подкласе или производне класе), засноване на постојећој класи (родитељској, основној или суперкласу). Производна класа наследђује особине (атрибуте) и методе родитељске класе, а такође може додавати своје или преоптерећивати наследене.

Основне концепције:

  • Проширење функционалности: Наслеђивањем од родитељске класе, производна класа добија основну функционалност и може је проширити додавањем нових метода или својстава.
  • Преоптерећење метода: Производна класа може променити понашање метода наследеног од родитељске класе кроз креирање метода са истим именом (полиморфизам).
  • Поновна употреба кода: Омогућава избегавање дуплирања кода, јер је заједничка логика дефинисана у родитељској класи.
  • Однос "је": Наслеђивање моделује однос "је нешто" (is-a). На пример, "Мачка је животиња".
<?php

class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function speak() {
        echo "Непознат звук\n";
    }
}

class Dog extends Animal {
    public function speak() {
        echo "Лаја-лаја!\n";
    }
}

class Cat extends Animal {
    public function speak() {
        echo "Мјау-мјау!\n";
    }
}

$dog = new Dog("Бобик");
$dog->speak(); // Излаз: Лаја-лаја!

$cat = new Cat("Мурка");
$cat->speak(); // Излаз: Мјау-мјау!

?>

У PHP-у, наслеђивање се реализује помоћу кључне речи extends. Једна класа може наследити само од једне класе (једноставно наслеђивање), али може реализовати више интерфејса.

Приступ својствима и методама родитељске класе из дете могућ је коришћењем кључне речи parent::.

<?php

class ParentClass {
    protected $value = "родитељска вредност";

    public function showValue() {
        echo $this->value . "\n";
    }
}

class ChildClass extends ParentClass {
    // Презапис својства
    protected $value = "детељска вредност";

    public function showValues() {
        // Позив методе родитељске класе
        parent::showValue();
        // Испис вредности детељске класе
        echo $this->value . "\n";
    }
}

$obj = new ChildClass();
$obj->showValues();
// Излаз:
// родитељска вредност
// детељска вредност

?>

Кључни модификатори приступа:

  • public: Доступан свуда.
  • protected: Доступан унутар класе и у наследним класама.
  • private: Доступан само унутар класе.

Методе могу бити објављене као final, што забрањује њихово преоптерећење у детељским класама. Такође, класе могу бити final, што забрањује њихово наследство. Могу бити и abstract, што захтева њихову реализацију у детељским класама.