PHPにおけるOOPのクラス継承とインターフェース実装
クラスは別のクラスを継承し、 同時に何らかのインターフェースを実装することができます。 実際の例で見てみましょう。
Programmerというクラスを作りたいとします。
このクラスには名前、給料、そしてプログラマが知っている
言語のリストを持たせます。
現時点でのクラスの説明は非常に曖昧です:
はい、クラスには名前、給料、言語があります -
しかし、このクラスにはどんなメソッドがあるでしょうか?
インターフェース iProgrammer を使って
クラスをより正確に定義してみましょう:
<?php
interface iProgrammer
{
public function __construct($name, $salary);
public function getName();
public function getSalary();
public function getLangs();
public function addLang($lang);
}
?>
すでに実装されているクラスを調べてみると、
似たようなクラス Employee がすでにあることが分かりました。
このクラスは Programmer クラスのすべてのメソッドを
実装しているわけではありませんが、一部は実装しています。
以下がすでに存在するクラスのコードです:
<?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 クラスから
継承するようにするのが理にかなっています
(残りの部分は新しいクラス自体で後で実装します):
<?php
class Programmer extends Employee
{
}
?>
また、クラス Pogrammer は
インターフェース iProgrammer を
実装する必要があることが分かっています:
<?php
class Programmer implements iProgrammer
{
}
?>
クラス Employee からの継承と
インターフェース iProgrammer の実装を
組み合わせてみましょう:
<?php
class Programmer extends Employee implements iProgrammer
{
}
?>
結果として、私たちのクラス Pogrammer は
クラス Employee からメソッド
__construct、getName、getSalary を継承し、
メソッド addLang と getLangs は
自分たちで実装する必要があります:
<?php
class Programmer extends Employee implements iProgrammer
{
public function addLang($lang)
{
// 実装
}
public function getLangs()
{
// 実装
}
}
?>
インターフェース iProgrammer は、
メソッドがそのクラス固有のものか継承されたものかは気にしません
- 重要なのは、記述されたすべてのメソッドが実装されていることです。
私の Employee クラスと
インターフェース iProgrammer のコードをコピーしてください。
私の Programmer クラスの草案はコピーしないでください -
私のコードを見ずに、このクラスを自分で実装してください。