抽象類與接口是面向對象設計中實現「契約式編程」與「多態」的核心機制。本文通過完整的幾何圖形層級結構,演示抽象類、抽象方法、實體類、接口的定義與協作,並展示運行結果。
interface/implements,支持多實現。<?php
// 抽象根類
abstract class Shape {
abstract function getArea(); // 抽象方法:計算面積
}
// 抽象子類:多邊形
abstract class Polygon extends Shape {
abstract function getNumberOfSides(); // 抽象方法:邊數
}
// 實體類:三角形
class Triangle extends Polygon {
public $base;
public $height;
public function getArea() {
return ($this->base * $this->height) / 2;
}
public function getNumberOfSides() {
return 3;
}
}
// 實體類:矩形
class Rectangle extends Polygon {
public $width;
public $height;
public function getArea() {
return $this->width * $this->height;
}
public function getNumberOfSides() {
return 4;
}
}
// 實體類:圓形(直接繼承 Shape,非多邊形)
class Circle extends Shape {
public $radius;
public function getArea() {
return pi() * $this->radius * $this->radius;
}
}
// 普通類:顏色(無關繼承體系)
class Color {
public $name;
}
// 構建對象集合
$myCollection = array();
$r = new Rectangle; $r->width = 5; $r->height = 7; $myCollection[] = $r;
$t = new Triangle; $t->base = 4; $t->height = 5; $myCollection[] = $t;
$c = new Circle; $c->radius = 3; $myCollection[] = $c;
$col = new Color; $col->name = "blue"; $myCollection[] = $col;
// 多態遍歷
foreach ($myCollection as $s) {
if ($s instanceof Shape) print("Area: " . $s->getArea() . "<br>\n");
if ($s instanceof Polygon) print("Sides: " . $s->getNumberOfSides() . "<br>\n");
if ($s instanceof Color) print("Color: " . $s->name . "<br>\n");
print("<br>\n");
}
?>
Area: 35
Sides: 4
Area: 10
Sides: 3
Area: 28.274333882308
Color: blue
Shape 定義通用契約 getArea(),不關心具體實現。Polygon 擴展契約,增加 getNumberOfSides(),語義更精確。Circle 直接繼承 Shape,不強迫實現無意義的 getNumberOfSides(),體現「接口隔離原則」。instanceof 判斷類型,安全調用特定方法,實現運行時多態。| 場景 | 推薦 | 理由 |
|---|---|---|
| 需要提供部分默認實現 | 抽象類 | 可包含非抽象方法、屬性、構造函數 |
| 純行為契約、多實現、無狀態 | 接口 | 類可實現多個接口,解決單繼承限制 |
| 核心領域模型、層級穩定 | 抽象類 | 表達「是一種」關係,語義更強 |