Sobes.tech
Junior

Объектке багытталган программалоодо мурас алуу принциптери жөнүндө айтып бере аласызбы?

sobes.tech AI

AIден жооп

Мурас калуу жаңы класс түзүүгө мүмкүндүк берет (туунду же өнүмдүк), бар болгон класске негизделген (ата-эне, негизги же суперкласс). Туунду класс ата-эне классинин касиеттерин (атрибуттарды) жана ыкмаларын мурастайт, ошондой эле өзүнүн касиеттерин кошуп же мурасталгандарын кайра аныктай алат.

Негизги түшүнүктөр:

  • Функционалдуулукту кеңейтүү: Ата-эне классинен мурастап, туунду класс негизги функционалдуулукту алат жана аны жаңы ыкмалар же касиеттер кошуу аркылуу кеңейтүү мүмкүнчүлүгүнө ээ болот.
  • Ыкмаларды кайра аныктоо: Туунду класс ата-эне классынан мурасталган ыкманың жүрүм-турумун өзгөртүп, ошол эле аталыштагы ыкманы түзүү аркылуу (полиморфизм) ишке ашыра алат.
  • Кодду кайра колдонуу: Жалпы логиканы ата-эне классында аныктагандыктан, кодду кайталоодон сактайт.
  • "бар" деген мамиле: Наследование "бар" деген мамилени моделдештирет (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 деп белгиленсе, алардын туунду классларда ишке ашырылышы талап кылынат.