目前共有5篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:港澳繁體▼
 
點擊 回復
648 4
【示例】面向對象中的多態性
一派掌門 二十級
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++中普通的虛函數。
 

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:648 回複數:4
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-6-5 22:00
 
©2010-2025 Purasbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。