კლასის მემკვიდრეობა და ინტერფეისის რეალიზაცია OOP-ში PHP-ში

კლასს შეუძლია მემკვიდრეობით მიიღოს სხვა კლასი და ამასთანავე რეალიზაცია გაუწიოს რაიმე ინტერფეისს. განვიხილოთ პრაქტიკული მაგალითით.

დავუშვათ, გვსურს შევქმნათ კლასი Programmer, რომელსაც ექნება სახელი, ხელფასი და ენების სია, რომელთა ცოდნაც პროგრამისტს გააჩნია. ჩვენი აღწერა კლასისთვის ჯერჯერობით საკმაოდ გაურკვეველია: დიახ, კლასში იქნება სახელი, ხელფასი, ენები - მაგრამ რა მეთოდები ექნება ჩვენს კლასს?

მოდით, უფრო ზუსტად აღვწეროთ ჩვენი კლასი ინტერფეისის iProgrammer საშუალებით:

iProgrammer.php<?php
  interface iProgrammer
  {
    public function __construct($name, $salary);
    public function getName();
    public function getSalary();
    public function getLangs();
    public function addLang($lang);
  }
?>

დავუშვათ, ჩვენ უკვე რეალიზებულ კლასებში ჩავუღრმავდით და აღმოჩნდა, რომ ჩვენ უკვე გვაქვს მსგავსი კლასი Employee. ის არ რეალიზებს ყველა Programmer კლასის მეთოდს, მაგრამ ნაწილს რეალიზებს. აი, ჩვენთან უკვე არსებული კლასის კოდი:

Employee.php<?php
  class Employee
  {
    private $name;
    private $salary;
    
    public function __construct($name, $salary)
    {
      $this->name = $name;
      $this->salary = $salary;
    }
    
    public function getName()
    {
      return $this->name;
    }
    
    public function getSalary()
    {
      return $this->salary;
    }
  }
?>

ლოგიკური იქნება, რომ ჩვენს შემთხვევაში გავაკეთოთ ისე, რომ ჩვენმა ახალმა კლასმა Programmer მემკვიდრეობით მიიღოს საჭირო მეთოდების ნაწილი Employee კლასიდან (და ნაწილი კი ჩვენ შემდგომ ახალ კლასში რეალიზებულ იქნება):

Programmer.php<?php
  class Programmer extends Employee
  {
    
  }
?>

ამასთან, ჩვენ ვიცით, რომ Pogrammer კლასმა უნდა რეალიზაცია გაუწიოს ინტერფეისს iProgrammer:

Programmer.php<?php
  class Programmer implements iProgrammer
  {
    
  }
?>

მოდით, გავაერთიანოთ მემკვიდრეობა Employee კლასიდან და ინტერფეისის iProgrammer რეალიზაცია:

Programmer.php<?php
  class Programmer extends Employee implements iProgrammer
  {
    
  }
?>

გამოვა, რომ ჩვენი Pogrammer კლასი მემკვიდრეობით მიიღებს Employee კლასიდან მეთოდებს __construct, getName და getSalary, ხოლო მეთოდები addLang და getLangs ჩვენ თვითონ უნდა რეალიზაცია გავუწიოთ:

Programmer.php<?php
  class Programmer extends Employee implements iProgrammer
  {
    public function addLang($lang)
    {
      // რეალიზაცია
    }
    
    public function getLangs()
    {
      // რეალიზაცია
    }
  }
?>

ინტერფეისს iProgrammer არ აინტერესებს, კლასის ნაწილია მეთოდები თუ მემკვიდრეობით მიღებული - მთავარია, რომ ყველა აღწერილი მეთოდი იყოს რეალიზებული.

Задание 1

დააკოპირეთ ჩემი Employee კლასის კოდი და ინტერფეისის iProgrammer კოდი. ნუ დააკოპირებთ ჩემს Programmer კლასის ჩანაწერს - ჩემს კოდს რომ არ ნახოთ, თავად რეალიზაცია გაუწიოთ ამ კლასს.