目前共有5篇帖子。
【示例】物件導向中的多態性
1樓 巨大八爪鱼 2016-6-5 21:49
<?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
2樓 巨大八爪鱼 2016-6-5 21:53
多態性除了可以用介面實現外,還可以用抽象類來實現。
例如:
<?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);
?>
3樓 巨大八爪鱼 2016-6-5 21:56
在C++中,抽象方法是用純虛函數來實現的。
例如
abstract public function calcArea();
在C++裡面寫為:
virtual void calcArea() = 0;

當然多態性也不一定要用純虛函數,就是普通的虛函數(即基類有實現)也行:
virtual void calcArea()
{
    // do something
}
4樓 巨大八爪鱼 2016-6-5 21:58
C++中如果基類的方法不聲明為虛函數,那麼基類的指針就只能調用基類的方法。(不能實現多態性)
如果聲明為虛函數,基類的指針就能調用派生類的同名方法。(實現了多態性)
如果聲明為純虛函數,那麼基類的方法就不需要在基類實現,只需要在派生類實現。
5樓 巨大八爪鱼 2016-6-5 22:00
在PHP中,把基類Shape定義成下面這樣也是合法的:
class Shape {
    public function calcArea() {
        return 0;
    }
}
即calcArea方法在基類中也有實現。
這個就相當於C++中普通的虛函數。

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
 
 
©2010-2024 Arslanbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。