ポリモーフィズムを実現するために抽象クラスを利用することは便利ですが、多重継承が出来ないので全てのメソッドを1つの抽象クラスにまとめなくてはなりません。サブクラスの用途によっては必要のないメソッドまでオーバーライドしなくてはならないので面倒になります。
そこで、もっと便利に使えるようにするのがインターフェイスです。インターフェイスは抽象メソッドだけを持つクラスで、多重に引き継ぐことが出来ます。
インターフェイスを実装する
インターフェイスは、継承と同じようにインターフェイスの機能を引き継ぐことが出来ます。これを実装といい、必要な数だけ実装できます。
インターフェイスの注意点は以下の通りです。
- 抽象メソッドだけを定義でき、抽象メソッドの中身を書いてはいけない
- 配下のメソッドにabstractは付けない
- アクセス修飾子はpublicのみ
ではインターフェイスの宣言と実装をしてみましょう。
<?php
interface ISample{
const NUM = 10;
public function mul($n);
public function div($n);
}
?>
次にスーパークラスを作成します。
<?php
class Super {
public $val;
public function show(){
print "値は{$this->val}";
}
}
?>
サブクラスでSuperクラスを継承すると同時にインターフェイスを実装します。
<?php
require_once "Super.php";
require_once "ISample.php";
class Sub extends Super implements ISample {//implements を付けてインターフェイスを実装
public function mul($n){
$this->val = $n * 2;
}
public function div($n){
$this->val = $n / 2;
}
}
?>
では表示してみましょう。
<html>
<head>
<meta charset="utf-8">
<title>interface</title>
</head>
<body>
<?php
require_once 'Sub.php';
$sub = new Sub();
$sub->mul(10);
$sub->show();
$sub->div(50);
$sub->show();
?>
</body>
</html>
表示してみますと、インターフェイスの実装と親クラスのメソッドを実行できたことが分かります。
インターフェイスをチェックする
ポリモーフィズムの実現のため、対象のクラスに実装されているインターフェイスを確認することが必要です。コードを読んで確認もできますが、プログラムを使って確認することもできます。
クラスやインターフェイスは、integerなどと同様にデータ型であります。インスタンスの型をチェックするのがinstanceof演算子です。instanceof演算子を使うと以下の条件を満たしていればTRUEが返されます。
- 指定したクラスのインスタンスであるか
- 指定したクラスのサブクラスのインスタンスであるか
- 指定したインターフェイスを実装したクラスのインスタンスであるか
スーパークラス、インターフェイス、それらを継承・実装したサブクラスを作成します。
<?php
class DefMem{
const PI = 3.14;
protected $radius;
protected $height;
}
?>
<?php
interface ISample {
public function getNum();
}
?>
<?php
require_once 'DefMem.php';
require_once 'ISample.php';
class Area extends DefMem implements ISample{
public function __construct($radius){
$this->radius = $radius;
}
public function getNum(){
return pow($this->radius, 2) * self::PI;
}
}
?>
<html>
<head>
<meta charset="utf-8">
<title>オーバーライド</title>
</head>
<body>
<?php
require_once "Area.php";
$figure = new Area(5);
if($figure instanceof ISample){
print get_class($figure) . ':' . $figure->getNum();
}
?>
</body>
</html>
表示してみますとしっかり出力されていますね。ISampleインターフェイスを実装しているのが分かります。このようにチェックすることもできます。
コメント