Luokan perintä ja rajapinnan toteutus OOP:ssa PHP:ssä

Luokka voi periä toisesta luokasta ja samalla toteuttaa jotain rajapintaa. Tarkastellaan käytännön esimerkillä.

Oletetaan, että haluamme tehdä luokan Programmer, jolla on nimi, palkka ja lista kielistä, joita ohjelmoija osaa. Tällä hetkellä luokkamme kuvaus on melko epämääräinen: kyllä, luokassa on nimi, palkka, kielet - mutta mitkä metodit luokassamme tulevat olemaan?

Kuvataan luokkaamme tarkemmin rajapinnan iProgrammer avulla:

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

Oletetaan, että olemme kaivautuneet jo toteuttamiemme luokkien joukkoon ja, kääntääkö, meillä on jo samankaltainen luokka Employee. Se ei toteuta kaikkia luokan Programmer metodeja, mutta osan. Tässä on koodi jo olemassa olevasta luokastamme:

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

On loogista tehdä niin, että uusi luokkamme Programmer perii osan tarvitsemistaan metodeista luokasta Employee (ja osan toteutamme myöhemmin uudessa luokassa):

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

Samalla tiedämme, että luokan Pogrammer tulee toteuttaa rajapinta iProgrammer:

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

Yhdistetään luokan Employee perintä ja rajapinnan iProgrammer toteutus:

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

Saamme siis sen, että luokkamme Pogrammer perii luokalta Employee metodit __construct, getName ja getSalary, ja metodit addLang ja getLangs meidän on toteutettava itse:

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

Rajapinnalle iProgrammer ei ole väliä, ovatko metodit luokan omia vai perittyjä - tärkeintä on, että kaikki kuvatut metodit ovat toteutettuna.

Задание 1

Kopioi luokkani Employee koodi ja rajapinnan iProgrammer koodi. Älä kopio luokan Programmer aihiota - toteuta tämä luokka itse katsomatta koodiini.