PHPにおけるOOPのクラス継承とインターフェース実装

クラスは別のクラスを継承し、 同時に何らかのインターフェースを実装することができます。 実際の例で見てみましょう。

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 クラスの草案はコピーしないでください - 私のコードを見ずに、このクラスを自分で実装してください。