ホームページ >バックエンド開発 >PHPチュートリアル >PHP5.0 オブジェクト モデルの探索: 抽象メソッドと抽象クラス_PHP チュートリアル
オブジェクト指向プログラムは、クラスの階層構造を通じて構築されます。PHP などの単一継承言語では、ルート クラスに 1 つ以上のサブクラスがあり、各サブクラスから 1 つ以上のサブクラスが継承されます。さらに次のレベルのサブカテゴリ。もちろん、異なる機能を実装するために複数のルート クラスが使用される場合もあります。適切に設計されたシステムでは、各ルート クラスに、アプリケーション コードで使用できる便利なインターフェイスが必要です。アプリケーション コードがルート クラスで動作するように設計されている場合は、ルート クラスを継承するサブクラスでも動作できます。
抽象メソッドは、サブクラス内の一般メソッドと同じようにプレースホルダーです(場所を占めますが、機能しません)。一般メソッドとは異なり、コードはありません。クラス内に 1 つ以上の抽象メソッドがある場合、そのクラスは抽象クラスになります。抽象クラスをインスタンス化することはできません。抽象クラスを継承してからサブクラスをインスタンス化する必要があります。また、抽象クラスをサブクラスのテンプレートとして考えることもできます。
すべての抽象メソッドをオーバーライドすると、サブクラスは通常のクラスになります。すべてのメソッドがオーバーライドされない場合でも、サブクラスは抽象メソッドのままです。クラスに抽象メソッドが含まれる場合は (たとえ 1 つしかない場合でも)、class キーワードの前に abstract を追加して、クラスを抽象として宣言する必要があります。
抽象メソッドの宣言の構文は、一般メソッドの宣言の構文と異なり、一般メソッドのように本体が中括弧{}で囲まれておらず、セミコロン;で終わります。
例6.13では、getAreaメソッドを使用してクラスShapeを定義しました。ただし、図形の形状が分からないと面積を求めることができないため、getArea メソッドを抽象メソッドとして宣言しました。 Shape オブジェクトをインスタンス化することはできませんが、例 6.13 のように、継承したり式で使用したりすることはできます。
抽象メソッドのみでクラスを作成する場合は、インターフェイスを定義します。この状況を説明するために、PHP にはインターフェースがあり、キーワードが実装されています。抽象クラスの代わりにインターフェイスを使用し、extends の代わりに実装を使用してクラス定義を記述することも、たとえば、myClass を実装して myIterface を実装することもできます。個人の好みに応じて、これら 2 つのメソッドのどちらかを選択できます。
/*注意:
2 つのメソッドは以下を参照します:
1. 抽象クラス aaa{} (aaa には抽象メソッドのみがあり、一般的なメソッドはないことに注意してください)
class bbb extends aaa{} (aaa の抽象メソッドをオーバーライドします) bbb )
2. インターフェース aaa{}
クラス bbb は aaa{} を実装します (bbb の aaa の抽象メソッドをオーバーライドします)
*/
リスト 6.13 抽象クラス
//抽象ルートクラス 抽象ルートクラス
抽象クラス Shape
{
abstract function getArea() //抽象メソッドを定義する
}
//抽象子クラス 抽象サブクラス
抽象クラス Polygon extends Shape //Polygon
{
abstract function getNumberOfSides()
}
//具象クラス エンティティクラス トライアングルクラス
クラス Triangle extends Polygon
{
public $base;
public $height;
{
return(($this->base * $this->height)/2)
}
;
{
return(3) }
}
//具象クラス エンティティクラス 四辺形
{
public $width;
public $height;
public function getArea()
{
}
;
パブリック関数 getNumberOfSides()
{
}
}
;
//具象クラス エンティティ クラス サークル
クラス サークル extends Shape
public $radius;
public function getArea()
{
return(pi() * $this->radius * $this->radius)
}
//具体的なルートクラスはカラークラスを定義します
class Color
{
}
$myCollection = array(); //図形のコレクションを作成し、配列に入れます
//長方形を作成します
$r->高さ = 7;
$myCollection[] = $r;//三角形を作成します
$t = 新しい三角形;
$t->高さ = 5;
$myCollection[] = $t;
//円を作成します
$c = 新しい円;
//色を作成します
$c = 新しい色;
$myCollection[] = $c;
foreach($myCollection as $s)
{
if($s instanceof Shape) //$s が Shape クラスのインスタンスの場合
print("Area: " . $s->getArea() . "n " );
}
if($s instanceof Polygon)
{
if($sinstanceofColor)
{
print("Color: $s->name n")
}
}
?>