- ベストアンサー
インターフェイスと抽象クラスについて
オブジェクト指向について学んでいます。 下記のように、単体でクラスを定義して各メソッドの実行する方法などは理解しているつもりです。 class Test { public function __construct() { // コンストラクタ } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } $test = new Test(); $test->setName('太郎'); echo $test->getName(); // 太郎 ここまではいいのですが、インターフェイスと抽象クラスってどんな時に使うべきなのでしょうか? 簡単な例で使い方を紹介しているサイトはいくつかあるのですが実用性がないものばかりで、これらは本当に必要なものなのか?という疑問があります。。。 具体的に実用性がある例で使い方とメリットをおしえていただけませんでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
では、これはいかがでしょうか? 下記のような形で実行時でないとクラスが決定しない場合にもinterfaceやabstractは有効かと思います。 interface Logger { public function output($msg); } class Logger_File extends Logger { public function output($msg) { // ファイルにメッセージを出力する処理 } } class Logger_Mail extends Logger { public function output($msg) { // メールにメッセージを出力する処理 } } class Logger_DB extends Logger { public function output($msg) { // DBにメッセージを出力する処理 } } $type = $_GET['type']; $classname = 'Logger_'.$type; $logger = new $classname(); $logger->output('this is test'); あとは、CakePHP,Symphonyなどのフレームワークのソースをのぞいてみるとメリットが分かりやすいかもしれません。 自分でフレームワークを作る場合にはとても重宝します。
その他の回答 (1)
- daisdice
- ベストアンサー率100% (4/4)
自分の感じるメリットは以下の2点です。 (1)実装の分担がしやすい interfaceやabstractメソッドは派生先で決まったメソッド名、引数の実装が強制されるため、 メソッドの中身を実装しなくても、それを使う側の実装が可能になります。 具体的な場面としては 「AさんはBさんの実装するメソッドの中身を知らなくても、(Bさんがメソッドの中身をまだ実装していなくても) 関数名と引数が分かっているので、Bさんの実装するメソッドを呼び出すプログラムを組むことができる」 といったところでしょうか。 大規模プロジェクトでは先にインターフェースを設計したのちに、中身を実装することが多々あります。 (2)ルールが決まっているためオブジェクトの取り換えが容易 たとえば、データベースアクセスクラスのinterfaceを作成する場合、 データベースの種類(MySQL,Oracle,PostgresSQLなど)によって実装内容は全く変わってきますが、 検索するメソッドは function select($sql); 登録するメソッドは function insert($sql); のような形であらかじめinterfaceや抽象クラスで決まっていれば、 それを呼び出す元のプログラムはほとんど変更することなく、 データベースの種類を変更することができるようになります。 PHPではメソッドの戻り値の型が定義できないため、戻り値の型の担保がとれませんが、 javaなど他のオブジェクト指向言語では戻り値の型をメソッド定義の際に行うので、 戻り値の型も保証され、より精度の高い実装の強制が可能になります。
補足
お返事ありがとうございます。 (2)の例で、データベースアクセスクラスのinterfaceを作成する場合ですが クラスを作成する場合、普通は○○用のクラスや△△用のクラスという感じに 必要な機能の数だけ単体でクラスを定義しますよね? これと同様に、データベースの操作(selectやinsert)用のクラスを単体で 用意してやって必要なファイルでnewしてやれば同じだと思うのですが、何が 違うのでしょうか? 基本的な部分だとは思うのですが、インターフェイスと抽象クラスでこの部分が いまいち理解できておりません^^;
補足
お返事ありがとうございます。 上げてもらった例では、interface Loggerを定義しなくてもいいような気もするので メリットが見出せませんが私の知識不足もありますので、おっしゃる通りにCakePHPなどの フレームワークのソースをのぞいてみたいと思います。