オブジェクト指向プログラミングには、インターフェイスと抽象クラスというものがあります。
ぶっちゃけ重要度は低いですが、見かけたら「あーこれね!」ってくらいで充分だと思います。
僕はあまり使わないので内容間違ってたらごめんなさい。
インターフェイスとは
インターフェイスは英語で interface と書き、意味は境界面です。
オブジェクト指向のプログラミング言語で、オブジェクトにアクセスするためには public で定義されたインスタンス変数かメソッドしかありません。
インターフェイスはそのインスタンス変数のうち const で定義した定数(以下「定数」)とメソッドの名前だけを定義するものです。
中身はまったくありません。
オブジェクトをマンションで例えると、部屋の番号だけ定義されていて部屋の中は何も無いという感じです。
オブジェクトの設計書であるクラスを見なくても、何号室の玄関があるということだけ分かります。
ポットクラスがあった場合、必ず水は貯めますよね?
ポットインターフェイスを作成する場合は、水を追加するメソッド名などだけを予め定義しておくというものです。
そのポットインターフェイスを実装すると、ただの水を貯めるポットや電気ポット、電気ケトルなどが作れるということです。
そしてそれらのクラスには必ず水を追加するメソッドが無いとエラーになります。
つまり、ただのポットでも電気ポットでもケトルでも、玄関は何番かは分かるということです。
インターフェイスの書き方
1 2 3 4 5 |
interface PotIF { function addWater($water); function getWater(); } |
メソッドは {} は書かずに ; で終了させます。
そしてインターフェイスを実装するクラスでは、クラス名の後ろに implements と書き、IF名を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
require_once("PotIF.php"); class Pot implements PotIF { public $water = 0; function __construct($water) { $this->water = $water; } public function addWater($water) { $this->water += $water; } public function getWater() { return $this->water; } } |
今回は1つしかインターフェイスを実装しませんでしたが、複数実装する場合は
class Pot implements PotIF, PotIF2, PotIF3 {
のようにいくつでも書くことが出来ます。
インターフェイスの用途
用途と言っても僕はあまり使わないので・・・。
過去に見かけた事例ですが、例えば画面上でボタンを押したとします。
その場合、一般的に思いつくのは次の画面に遷移することです。
でも他にも入力内容を元にPDFを作成してダウンロードしたり、CSVをダウンロードしたりする場合があります。
その場合、画面遷移をするため用のインターフェイスと、ファイルをダウンロードする用のインターフェイスを作成し、予め必要そうなメソッドを定義するという感じです。
上の例はコントローラーの話でしたが、モデルなんかも同様のことが言えます。
他には定数を定義できるということで、定数をまとめて定義しまくるインターフェイスなんかも見たことあります。
そんなに大量ならDBに入れろよ!と思いましたが、DBアクセスはパフォーマンスが落ちるので変動しない定数はインターフェイスに定義していて必要なものだけを実装するといった具合です。
なるほど。そんな使い方もあるんですね。
抽象クラスとは
抽象クラスは通常のクラスとインターフェイスの間といった感じです。
中身の無い定数やメソッドを定義できるところはインターフェイスと同じですが、抽象クラスは中身のあるメソッドも同居させることが出来ます。
インターフェイスは境界面として使うことが目的でしたが、抽象クラスはクラスの分かる範囲だけ書いて分からんところはメソッド名だけ定義しておく下書きみたいな使い道が目的です。
なので public だけでなく protected や private も定義できます。
下書きなので抽象クラスをそのままインスタンス化は出来ません。
通常のメソッドは通常通りに書きますが、抽象メソッドは先頭に abstract と書きます。
実際の書き方については次に説明します。
抽象クラスの書き方
1 2 3 4 5 6 7 8 9 |
abstract class PotAbs { abstract function addWater($water); abstract function getWater(); function echoWater() { echo "水の量は ". $this->getWater(). "L です。"; } } |
抽象メソッドにも abstract をつけます。
これを実装する場合は以下のように extends をつけて継承します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
require_once("PotAbs.php"); class Pot extends PotAbs { public $water = 0; function __construct($water) { $this->water = $water; } public function addWater($water) { $this->water += $water; } public function getWater() { return $this->water; } } |
抽象クラスはクラスなのでインターフェイスの実装とは違い継承して使います。
抽象クラスの実装に関しても、実装するというよりオーバーライドする方が近いです。
インターフェイスは何個でも指定して実装できましたが、抽象クラスの場合は継承なので1つしか出来ません。
抽象クラスの用途
例えばログインが必要なWEBシステムを開発している場合、ログイン判定処理に関してはどのページを開いても共通なわけです。
上で、「画面遷移をするため用のインターフェイスと、ファイルをダウンロードする用のインターフェイスを作成し、予め必要そうなメソッドを定義するという感じです。」
とインターフェイスについて説明しました。
これにログイン機能だけ実装したい場合は抽象クラスを使うと便利です。
まとめ
インターフェイスは境界面の定義。
コンセントのように接続部分だけを定義し、その先に何の電気機器が動いているか、また電力会社がどこなのかは分かりません。
抽象クラスは、インターフェイスと似ているが、どちらかと言うとクラス寄りでクラスの下書き的ポジション。
抽象クラスにはインターフェイスのような抽象メソッドを定義できるが、中身のあるメソッドも定義できる。
コメントを残す