Masaaki皆さんは”インターフェース”と”抽象クラス”の違いを説明できますか?どちらも、対象のクラスに特定のメソッドの実装を強制させるもの、という性質は同じです。それでもインターフェースも抽象クラスも存在しているということは、必ずそれぞれの存在意義があるはずです。いえ、携わっているのが大規模な開発じゃなかったりして存在は知っているものの実際にお目にかかったことは無いという方も実は多いのではないかと思います。そこで、今回はインターフェースと抽象クラスの違いを、それぞれの働きから調べて行きたいと思います。(※今回は自分が触れる機会の多いPHPでのインターフェースと抽象クラスの使い方について調べます)インターフェースとは基本的な使い方を復習します。インターフェースです。sampleMethod();}インターフェースはinterfaceで宣言します。上記ではSampleという名前のインターフェースを定義しています。インターフェース内で宣言するのは一般的にメソッドのみです。そのメソッドも、上記の通り中身はまだ書けません。この名前のメソッドの実装を強制させます、という役割の宣言にすぎません。インターフェースの特性により、内部で宣言されるメソッドのアクセス修飾子は全てpublicでなければいけません。{}こうすることで、AというクラスにSampleInterfaceというインターフェースを適用させることが出来ます。上記のままではエラーになります。先ほどから書いている通り、インターフェースを適用されたクラスでは、そのインターフェースで宣言されているメソッドは必ず実装されていなければなりません。}}これで大丈夫です。メソッドの中身が空であろうが、とにかくインターフェース内で宣言されているメソッドが全て実装されていれば問題ありません。インターフェースは複数同時にクラスに適用させることができます。}}このように列挙させることでインターフェースは複数適用させることが出来ます。その際、メソッドは適用されているインターフェース内のもの全てを実装する必要があります。抽象クラスとは続いて、抽象クラスの使い方についてです。classで定義します。sampleMethod();}インターフェースと違うのは、メソッドの宣言の前にもabstractが必要という点です。抽象クラスを適用させたいときは、普通のクラスと同じくextendsで継承させます。}}インターフェース同様、抽象クラス内で宣言された抽象メソッドが適用された先で実装されていないとその時点でエラーとなります。逆にインターフェースと違う点としては、PHPが多重継承できない言語であることからもわかる通り、列挙で複数同時に適用させることはできないということです。extendsを用いているので、抽象クラス内で宣言する際のアクセス修飾子はpublicとprotectedが使えます。他に違いとしては、抽象クラスの中においては抽象メソッドではないプロパティやメソッドを実装することができるということです。C();$c->testMethod();上記のコードを実行すると1が出力されます。抽象クラス内の抽象メソッドではないメソッドは継承先でオーバーライドすることなく普通に利用することができるということです。それぞれの使い所は以上のことから、インターフェースと抽象クラスは非常に似通っていることがわかります。・インターフェースは実体のあるメソッドを宣言することが出来ず、抽象クラスでは出来る・インターフェースではメソッドの宣言しか出来ず、抽象クラスでは抽象ではないプロパティやメソッドを定義することが出来る・インターフェースは複数同時に適用させることが出来、抽象クラスでは出来ないが挙げられます。抽象クラスは、共通の挙動とそれぞれの違う挙動を持つインスタンスを複数作るときに役立つということがわかります。そこから考えてインターフェースはインスタンスを複数作るときに最低限実装すべきメソッドを保証するのに役立つと言えます。Strategyパターンのように、インスタンスの中身には関与せずにメソッドの呼び出し方のみ統一しようとした場合、想定しているメソッドがあったり無かったりするとややこしくなってしまうので、そういうときはインターフェースが有効となります。いえ、Strategyパターンにおける同様の役割は抽象クラスでも果たせます。まとめインターフェースは最低限の実装の明示や保証で、抽象クラスは共通部と差異の明示という、挙動の違いというより使用意図の違いがあるということがわかりました。Masaaki技術書は勿論、本全般が好き。品揃えの良い本屋に行くとテンション上がりすぎて後で具合が悪くなる。Tech当サイトはFOXHOUND株式会社のメンバーによる技術記事投稿サイトです。HOUND株式会社は2011年に誕生したシステム開発会社です。「お客様を知る事・理解する事」を企業理念と掲げております。社員一人ひとりがプロフェッショナルの自覚を持ってお客様と未来を創って行く。最初はそれで始まり最後もそうである様に日々活動を続けております。私たちが良い開発者であり続けるために、お客様の協力が必要です。弊社に悩みや希望を共有して下さい。