オブジェクト指向プログラムは、クラスの階層構造を通じて構築されます。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{} (bbb の aaa の抽象メソッドをオーバーライドします)
2. インターフェース aaa{}
class bbb は aaa{} を実装します (bbb の aaa の抽象メソッドをオーバーライドします)
*/
リスト 6.13 抽象クラス
// 抽象ルート クラス 抽象ルート クラス
抽象クラス Shape
{
抽象関数 getArea() // 抽象メソッドを定義します。
}
//抽象子クラス 抽象サブクラス
抽象クラス Polygon extends Shape //Polygon
{
抽象関数 getNumberOfSides();
}
//具象クラス エンティティクラス 三角形クラス
クラス Triangle は Polygon を拡張します
{
パブリック $base;
public $height;
public function getArea() //面積計算メソッドをオーバーライドします{
return(($this->base * $this->height)/2);
}
public function getNumberOfSides() //サイドカウントメソッドをオーバーライドします{
リターン(3);
}
}
//具象クラス エンティティクラス 四角形
クラス Rectangle は Polygon を拡張します
{
パブリック $width;
パブリック $height;
パブリック関数 getArea()
{
return($this->幅 * $this->高さ);
パブリック関数 getNumberOfSides(
)
{
リターン(4);
}
}
//具象クラスエンティティクラスサークル
クラス Circle は Shape を拡張します
{
パブリック $radius;
パブリック関数 getArea()
{
return(pi() * $this->radius * $this->radius);
}
}
//具体的なルートクラスはカラークラスを定義します
クラスカラー
{
パブリック $name;
$
myCollection = array(); //図形のコレクションを作成して配列に入れます
//長方形を作成します
$r = 新しい四角形;
$r->幅 = 5;
$r->高さ = 7;
$myCollection[] = $r;
unset($r);
//三角形を作成します。
$t = 新しい三角形;
$t->ベース = 4;
$t->高さ = 5;
$myCollection[] = $t;
unset($t);
//円を作成します
$c = 新しいサークル;
$c->半径 = 3;
$myCollection[] = $c;
unset($c);
//色を作成します
$c = 新しい色;
$c->name = "青";
$myCollection[] = $c;
unset($c);
foreach($sとして$myCollection)
{
if($s instanceof Shape) //$s が Shape クラスのインスタンスの場合{
print("エリア: " . $s->getArea() . "n");
if
($s ポリゴンのインスタンス)
{
print("サイド: " .$s->getNumberOfSides()."n");
if
($s 色のインスタンス)
{
print("カラー: $s->名前 n");
print
("n");
}
?>