|
<?php // 多態性 interface Shape { public function calcArea(); }
// 下面兩個類都實現了calcArea方法 class Rectange implements Shape { public $x, $y, $width, $height; public function calcArea() { return $this->width * $this->height; } }
class Circle implements Shape { const PI = 3.14; public $x, $y, $r; public function calcArea() { return $this->r * $this->r * self::PI; } }
// 多態性的核心思想:用基類的變數去調用子類的方法 function display_area(Shape $shape) { echo '該圖形的面積是: ' . $shape->calcArea() . '<br>'; }
$r = new Rectange(); $r->width = 400; $r->height = 380; display_area($r);
$c = new Circle(); $c->r = 4.8; display_area($c); ?>
運行結果: 該圖形的面積是: 152000 該圖形的面積是: 72.3456
|
|
多態性除了可以用介面實現外,還可以用抽象類來實現。 例如: <?php abstract class Shape { abstract public function calcArea(); }
class Rectange extends Shape { public $x, $y, $width, $height; public function calcArea() { return $this->width * $this->height; } }
class Circle extends Shape { const PI = 3.14; public $x, $y, $r; public function calcArea() { return $this->r * $this->r * self::PI; } }
function display_area(Shape $shape) { echo '該圖形的面積是: ' . $shape->calcArea() . '<br>'; }
$r = new Rectange(); $r->width = 400; $r->height = 380; display_area($r);
$c = new Circle(); $c->r = 4.8; display_area($c); ?>
|
|
在C++中,抽象方法是用純虛函數來實現的。 例如 abstract public function calcArea(); 在C++裡面寫為: virtual void calcArea() = 0;
當然多態性也不一定要用純虛函數,就是普通的虛函數(即基類有實現)也行: virtual void calcArea() { // do something }
|
|
C++中如果基類的方法不聲明為虛函數,那麼基類的指針就只能調用基類的方法。(不能實現多態性) 如果聲明為虛函數,基類的指針就能調用派生類的同名方法。(實現了多態性) 如果聲明為純虛函數,那麼基類的方法就不需要在基類實現,只需要在派生類實現。
|
|
在PHP中,把基類Shape定義成下面這樣也是合法的: class Shape { public function calcArea() { return 0; } } 即calcArea方法在基類中也有實現。 這個就相當於C++中普通的虛函數。
|