コラム

interface インターフェイスで入口出口の取り決めを作る

※この記事の注意事項
・できるだけ初心者の方が理解しやすいように、細かい説明は省略しております。
・最後まで読み進められるように、多少ユーモアを交えて表現していることがあります。

========================================

インターフェイスは入口出口を共通化すること

インターフェイスってなんだかカッコいい響きですよね。ユーザーインターフェイスとかってよく聞きますよね。
直訳すると界面なんて書いてありますが、界面なんて単語、日常生活で出てこないですよね。

インターフェイスは境目というか、入口であり出口なんですね。
例えばクラスどうしの場合は以下のようになりますし、

の部分です

| ̄ ̄ ̄ ̄ ̄ ̄ ̄    ̄ ̄ ̄ ̄ ̄ ̄ ̄|
|  クラス   ⇔   クラス  |
|_______   _______|

クラスの外からクラスを呼び出す時は以下のようになります。

| ̄ ̄ ̄ ̄ ̄ ̄ ̄
|  クラス   ⇔ グローバル(new Classとか)
|_______

アクセス権の話ですが、privateのようにクラス内部でしか使えないものもありますし、protectedのように自クラスとその子クラスでしか使えないものもあります。
しかし、クラスの外とつながるにはpublicが必ず必要になります。

なのでインターフェイスではpublicしか定義できません
でも、それでいいですよね。それでこそインターフェイスです。

インターフェイスでメソッドを定義するのですが、インターフェイスで実装を行うことはできません

インターフェイスを実装する場合は、implement インプリメントを使用してクラスに実装します。
以下ではCloneRobotクラスでRobotインターフェイスを実装しています。

interface Robot
{
    //メソッドを定義する
    public function talk($object, $name);

    //メソッドを定義する
    public function nod($face);
}

class CloneRobot implements Robot
{
    public function talk($object, $name)
    {
        echo $object."は".$name."です。\n";
    }

    public function nod($face)
    {
        echo $face."でうなずいた!";
    }
}

//クラスのインスタンス化
$isntance = new CloneRobot();

//メソッドの呼び出し
$isntance->talk('私', 'ロボット');

//メソッドの呼び出し
$isntance->nod('笑顔');

CloneRobotでは、Robotインターフェイスを実装することにより、話すこととうなずくことが保証されました
それはどんな名前であれ、どんな表情であれ、話し、うなずくのです。

インターフェイスは複数設定可能

インターフェイスはカンマ区切りで複数実装することができます。
以下ではRobotインターフェイスと、Animalインターフェイスを実装しています。

interface Robot
{
    //メソッドを定義する
    public function talk($object, $name);

    //メソッドを定義する
    public function nod($face);
}

interface Animal
{
    //メソッドを定義する
    public function fly($object);
}

class CloneRobot implements Robot, Animal
{
    public function talk($object, $name)
    {
        echo $object."は".$name."です。\n";
    }

    public function nod($face)
    {
        echo $face."でうなずいた!";
    }

    public function fly($object)
    {
        echo $object."は飛ぶ!!";
    }
}

//クラスのインスタンス化
$isntance = new CloneRobot();

//メソッドの呼び出し
$isntance->talk('私', 'ロボット');

//メソッドの呼び出し
$isntance->nod('笑顔');

//メソッドの呼び出し
$isntance->fly('私');

その他にも、インターフェイスは継承も使えます。
Animalインターフェイスが、Robotインターフェイスを継承してクラスに実装されています。

interface Robot
{
    //メソッドを定義する
    public function talk($object, $name);

    //メソッドを定義する
    public function nod($face);
}

interface Animal extends Robot
{
    //メソッドを定義する
    public function fly($object);
}

class CloneRobot implements Animal
{
    public function talk($object, $name)
    {
        echo $object."は".$name."です。\n";
    }

    public function nod($face)
    {
        echo $face."でうなずいた!";
    }

    public function fly($object)
    {
        echo $object."は飛ぶ!!";
    }
}

//クラスのインスタンス化
$isntance = new CloneRobot();

//メソッドの呼び出し
$isntance->talk('私', 'ロボット');

//メソッドの呼び出し
$isntance->nod('笑顔');

//メソッドの呼び出し
$isntance->fly('私');

割と自由自在なんですね、インターフェイスって。

まとめですが、

インターフェイスクラスのふるまいを共通化することが目的です。
ふるまいとはすなわち入口出口です。
インターフェイスはすべてpublicで、インターフェイス自体が実装を持つことはできません

インターフェイス定義と、クラスでの実装では、シグネチャは同じである必要があります
インターフェイスは複数実装したり、継承したりすることができます。
インターフェイスで定義されているメソッドは、すべてクラスで実装しなければエラーになります。

========================================

▼PHPのオブジェクト指向とデザインパターン記事一覧

関連記事

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。