作者共发了5篇帖子。 内容转换:不转换▼
 
点击 回复
517 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)
 

本帖信息

点击数:517 回复数:4
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-6-5 22:00
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。