
No.2ベストアンサー
- 回答日時:
インターフェイスは必要です。
これは、メソッドの実装を保証してくれるからです。例えば、何かのクラスを定義するとしましょう。このとき、インターフェイスを用意することで、そのメソッドが必ず実装されているものとみなして利用することができます。
例えば、インターフェイスAがあり、そこにABCというメソッドが宣言されているとします。そしてBというクラスがこのAを実装してあるとします。すると、このクラスBを利用する際、必ずそこにABCというメソッドがあるものとしてコードを書くことができるわけです。
クラスCでもクラスDでも、インターフェイスAが実装されていることがわかれば、そのABCメソッドを呼び出して利用する形で処理を構築できます。
抽象クラスでもそこにあるメソッドは保証されますが、インターフェイスはどんなクラスであっても、「追加するだけで特定のメソッドの実装が保証される」という特徴があります。なおかつ、必要であればいくつものインターフェイスを追加できます。こうした使い方は、抽象クラスでは行えません。
No.4
- 回答日時:
同じインターフェースを実装したクラスは同じ変数にキャストすることができます。
クラスは違うがある処理をする同じ名前のメソッドを実行する場合に、この特徴が必要になります。
定義済みのCountableインターフェースを利用した例をあげます。
Countableインターフェースはcount()メソッドの実装を義務づけています。
1つめのインターフェース実装クラスCounterAは、
setCountメソッドで設定された値をcount()メソッドでリターンします。
class CounterA implements Countable {
private $cnt = 0;
public function setCount($cnt) {
$this->cnt = $cnt;
}
public function count() {
return $this->cnt;
}
}
2つめのインターフェース実装クラスCounterBは、
データベースから取得したあるデータの件数をcount()メソッドでリターンします。
class CounterB implements Countable {
public function count() {
return データベースから取得したあるデータの数;
}
}
2つのインターフェースを実行するクラス CounterAppを次のように定義します。
class CounterApp {
private $obj;
public function setCounter(Countable $obj) {
$this->obj = $obj;
}
public function execute() {
echo $this->obj->count();
}
}
CounterAppクラスのsetCounterメソッドの引数にCountableインターフェースを指定しています。
Countableインターフェースを実装しているクラスであれば引数に渡すことができます。
呼び出しは以下のようになります。
$app = new CounterApp();
$counter = new CounterA();
$counter->setCount(10);
$app->setCounter($counter);
$app->execute();
$counter = new CounterB();
$app->setCounter($counter);
$app->execute();
同じ抽象クラスを実装していても、サブクラス同士のキャストはできません。
また抽象クラスは、インスタンスを作成できないので変数の型には使用できません。
参考URL:http://www.php.net/manual/ja/class.countable.php
No.3
- 回答日時:
> インタフェースという仕組みは必要でしょうか?
メジャーな言語でインターフェースを採用しているのはJavaとPHPぐらいかと思います。
Java の様な静的型付けで単一継承の言語であれば、インターフェース(または多重継承が無いことを補完する仕組み)は無いと困りますが、動的型付け言語での必要性は微妙ですね・・・。
PHPも単一継承言語言語ですから、引数に取るクラスの継承関係を縛らずにタイプヒンティングを利用したいっていう時に必要とはなります。が、タイプヒンティング自体がPHPに必要かどうかも微妙ですし・・・。
http://www.php.net/manual/ja/language.oop5.typeh …
参考URL:http://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83% …
No.1
- 回答日時:
インターフェースは、処理が実装されていないメソッドを宣言します。
実装したクラスで必ずメソッドを実装しなければならないです。
たとえば車、電車、自転車クラスを作るとします。
これらのクラスに共通して走るというメソッドを実装させたいけど、
その実装内容はクラス毎に違う場合にインターフェースを使います。
この例ですと、走るインターフェースを作成します。
【オブジェクト インターフェース】
http://www.php.net/manual/ja/language.oop5.inter …
抽象クラスは、メソッドや変数が実装された状態で定義されており、
継承クラスでは呼び出すだけで利用できます。
抽象クラスでもメソッド宣言のはじめにabstract指定子を記述して
インターフェースのように継承したクラスでオーバーライドしなければならないように実装できます。
例として、バス、タクシー、トラックの3つのクラスを作るとします。
3クラスとも車なので「走る」は同じだとします。
別々に定義すると3箇所同じ内容のメソッドを記入することになります。
この場合、車抽象クラスを使って、1箇所にまとめることができます。
もし「走る」の実装内容が違う場合は、abstract指定子をメソッドに宣言して
抽象クラスを継承したサブクラスで実装されることもできます。
【クラスの抽象化】
http://www.php.net/manual/ja/language.oop5.abstr …
world99さん。ご回答ありがとうございます。
大変よく理解できました。
しかし、抽象クラスがあれば、いちいちインタフェースで作り込む必要はないよう思えるのですが、
インタフェースという仕組みは必要でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- その他(プログラミング・Web制作) Chromeのデベロッパーツール プログラム 2 2022/06/21 20:27
- 芸術学 義務教育は抽象画でしょうかよろしくお願いしますm(_ _)m 3 2023/05/01 22:27
- その他(Microsoft Office) Outlookメール 連絡先の検索について 〈 ご説明 〉 Windows PC の Outlook 1 2022/09/23 14:43
- FX・外国為替取引 為替金額の決定方法 4 2022/04/24 11:12
- CPU・メモリ・マザーボード Socket AM4マザーに、レガシーなインタフェースが多数あるのはなぜ? 3 2023/02/17 10:47
- 教育・文化 教員をめざしている者です。以前教育実習で小学校に行った時、なんでもない会話から子供達にある国が嫌いと 13 2023/08/24 12:19
- 教えて!goo 結局、ネットは、匿名という制度があったほうがよいのか、無いほうがよいのか 希望者だけでも氏素性を明ら 19 2023/03/07 23:24
- オーケストラ・合唱 曲名について 5 2022/04/02 14:05
- 哲学 多重統括主観形相の育成(形式学) 1 2023/07/05 12:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
formで入力された情報を次のペ...
-
比較演算子===と!==について
-
クラス
-
WEBシステム作成でのオブジェク...
-
ラッパークラスって何ですか?
-
※staticと$thisの違いは何ですか
-
phpをオフラインで動かしたい
-
phpでお問い合わせフォームを作...
-
初めまして、
-
ファイルシステム関数関係
-
PHPのif文でその処理を途中で抜...
-
FTPコマンドでディレクトリごと...
-
引数を正しく読み込む方法
-
session_startでクッキー範囲を...
-
プログラミング作業効率を上げ...
-
microSDの装着による連続待受時...
-
Content-Typeが機能していない?
-
PHPを
-
ファイル(PDF・エクセル・ワー...
-
ブラウザのページキャッシュ機...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
PHP4、PHP5 1ファイル複数クラ...
-
phpのクラスにて別ファイルの変...
-
ラッパークラスって何ですか?
-
ワードプレスではPHPをどこまで...
-
class定義のphpをファイル分割...
-
ユーザ定義関数にデフォルト引...
-
php と perl
-
POSTとGET
-
PHP オートローダーについて
-
PHPでオブジェクト指向開発して...
-
配列とオブジェクトの違い
-
Smartyの変数について
-
正規表現について
-
phpのオブジェクトの使用方法に...
-
【PHP】set・getの使用について
-
DirectoryIteratorクラスについて
-
require_onceについて
-
クラスについて
-
クラスの生成の仕方
おすすめ情報