インターフェイスと抽象クラスについて - PHPプロ!Q&A掲示板

809

  • 0P

インターフェイスと抽象クラスについて

質問日時 / 2007年12月5日 16:39    回答数 / 2件

Questioner:  hamutama  このエントリーをはてなブックマークに追加 

キーワード / クラス    インターフェイス    抽象クラス   

いつもお世話になっております。

最近、クラスを勉強し始めたのですが「抽象クラス」と「インターフェイス」それに「実装」という言葉も出てきて、かなり困惑しています。

抽象クラスやインターフェイスの書き方はわかっているのですが、

・なぜ使うのか
・どのようなメリットがあるのか
・どのような時に使用するのか
・「クラスを実装する」という事はどういう事か

上記のようなことがわかりません。参考書には載っているのですが説明が少ししか載っていなくて、全然理解できません。

すみませんが、今回もよろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01wintermute一言で言うと、代数のようなものでしょうか? プログ
┗A02laquDevlaquDevと申します。 私も完全に理解しているかと

回答一覧

並び替え:

A01 満足
answererwintermute [12月5日 17:16]

一言で言うと、代数のようなものでしょうか?
プログラムの作り始めの頃は、いきあたりばったりで必要な処理を並べていけばなんだか自分の思った通りのものが作れてしまいますが、大きなプログラムになってくると、設計が大事になってきます.
で、その設計の部分で意味を持ってくるのです。

  1. Interface TestInterface {
  2.     function getVars();
  3. }
  4. /**
  5.    TestInterfaceを実装したクラスの、getVars()によって取得できる変数を表示するプログラム
  6.   */
  7. function dump(TestInterface $t) {
  8.     $var = $t->getVars();
  9.     if (is_array($var)) {
  10.         for ($i = 0, $I = sizeof($var); $i < $I; $i++) {
  11.             echo $var[$i]. "\n";
  12.         }
  13.     } else {
  14.         echo "$var\n";
  15.     }
  16. }
こう作っておくと、TestInterfaceを実装したクラスは、dump関数によって変数を表示できるようになる訳です。
で、このgetVars関数によって何を返すか?は、そのクラスを作った人によって自由です。
(クラス自身の名前を表示するのがいいなら名前を返せばいいし、メンバー一覧を表示するのがいいと思ったらメンバー一覧を返すようにすればいい訳です。)
まぁ、実際に色々つくっていくうちに納得いくようになるのではないでしょうか?

この意見に回答する

ツリーへ TOPへ

A02 満足
answererlaquDev [12月6日 00:59]

laquDevと申します。

私も完全に理解しているかと言われると怪しいですが、理解している範囲で言うと

・インターフェイス…機能の枠のみを定義する。
・抽象クラス…一部の動作のみ違う似かよった機能を定義する。

です。
たとえば、値チェックを行うクラスがあったとします。
  1. abstract class abstractChecker {
  2.  
  3.  public __construct($name, $value) {
  4.     $this->val = $value;
  5.     $this->name = $name;
  6.  }
  7.  
  8.  private $name;
  9.  public function getName() {
  10.     return $this->name;
  11.  }
  12.  
  13.  protected $val;
  14.  abstract function Validate();
  15. }
  16.  
  17. class boolChecker extends abstractChecker {
  18.   public function Validate() {
  19.     return is_bool($this->valu);
  20.   }
  21. }
  22.  
  23. class intChecker extends abstractChecker {
  24.   public function Validate() {
  25.     return is_int($this->valu);
  26.   }
  27. }
上記の抽象クラスと実装クラスがあった場合に、以下のようにforeachなどを使用して、一括でチェックできます。
  1. $checker = array(new boolChecker(0), new intCheker("hoge"));
  2.   $msg = "";
  3.   foreach ( $checker as $chk ) {
  4.     if ( !$chk->isValidate() ) $msg .= $chk->name."がエラー";
  5.   } 
  6.   echo $msg;
インターフェイスは「getName」の実装(実際のロジック)もサブクラスに任せることになります。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
マジッククォートとmysql_real_escape_string
 このエントリーをはてなブックマークに追加 
A
magic_quotes_gpcでは、SQLインジェクション対処は十分できません。主な理由として、以下が上げられます。 ・magic_quotes_gpcは文字コードを考慮しないで処理するので、Shift_JISを使っている場合、SQLインジェ...

>>続きを読む

SQLインジェクション対策は時と場合で使う関数が変わります。その時にあったものを使いましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)