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, რაც მოითხოვს მათ რეალიზაციას შვილური კლასებში.