Mantojums no klases un interfeisa implementācija OOP PHP

Klase var mantot no citas klases un tajā pašā laikā implementēt kādu interfeisu. Apskatīsim praktiskā piemērā.

Pieņemsim, ka mēs vēlamies izveidot klasi Programmer, kurai būs vārds, alga un saraksts ar valodām, ko programmētājs prot. Pagaidām mūsu klases apraksts ir diezgan neskaidrs: jā, klasē būs vārds, alga, valodas - bet kādas metodes būs mūsu klasē?

Precīzāk aprakstīsim mūsu klasi ar interfeisa iProgrammer palīdzību:

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

Pieņemsim, ka mēs iedziļinājāmies jau implementētajās klasēs un, izrādās, mums jau ir līdzīga klase Employee. Tā implementē ne visas klases Programmer metodes, bet daļu. Lūk, jau mums esošās klases kods:

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;
    }
  }
?>

Loģiski mūsu gadījumā būtu darīt tā, lai mūsu jaunā klase Programmer mantotu daļu nepieciešamo sev metožu no klases Employee (un daļu mēs pēcāk implementēsim jau pašā jaunajā klasē):

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

Turklāt mums ir zināms, ka klasei Pogrammer jāimplementē interfeiss iProgrammer:

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

Apvienosim mantojumu no klases Employee un interfeisa iProgrammer implementāciju:

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

Izrādīsies, ka mūsu klase Pogrammer mantos no klases Employee metodes __construct, getName un getSalary, bet metodes addLang un getLangs mums nāksies implementēt:

Programmer.php<?php
  class Programmer extends Employee implements iProgrammer
  {
    public function addLang($lang)
    {
      // implementācija
    }
    
    public function getLangs()
    {
      // implementācija
    }
  }
?>

Interfeisam iProgrammer ir vienalga, vai metodes ir klases pašas vai mantotas - galvenais, lai visas aprakstītās metodes būtu implementētas.

Задание 1

Nokopējiet mana klases Employee kodu un interfeisa iProgrammer kodu. Nekopējiet manu klases Programmer sagatavi - iespējami neieskatoties manā kodā, implementējiet šo klasi patstāvīgi.