php——31-面向对象三大特性之多态

多态的概念

  • 可以理解为多种表现形式,即“一个对外接口(方法),多个内部实现”。
  • 在面向对象的理论中,多态性的一般定义为:同一个操作(函数)作用于不同的类的实例,将产生不同的执行结果。也即不同类的对象收到相同的消息时,将会得到不同的结果。

实例

  • 体会PHP中正常的流程控制的不可取与多态的实用性设计

问题:流程控制的弊端

class Light
{
    public function show($type = 0)
    {
        //流程控制假如灯光颜色非常多,后期添加就会非常麻烦
        switch ($type) {
            case 0:
                echo '灯光是红色。<br>';
                break;
            case 1:
                echo '灯光是白色。<br>';
                break;
            case 2:
                echo '灯光是蓝色。<br>';
                break;
            case 3:
                echo '灯光是紫色。<br>';
                break;
            default:
                echo '灯光是血红色。<br>';
                break;
        }
    }
}

class User
{
    function openLight($type = 0)
    {
        $light = new Light();
        $light->show($type);
    }
}

$cc = new User();
$cc->openLight();//灯光是红色。

解决一:多态之继承实现

class Light
{
    function show()
    {
        echo '灯光随机演示。' . '<br>';
    }
}

class BlueLight extends Light
{
    function show()
    {
        echo '灯光是蓝色。' . '<br>';
    }
}

class RedLight extends Light
{
    function show()
    {
        echo '灯光是红色。' . '<br>';
    }
}

class Demo
{
    function show()
    {
        echo '我不是灯光。' . '<br>';
    }
}

class User
{
    /**
     * @param $obj
     * 开灯
     * (Light $obj)限定类型为Light(之后新添颜色继承自Light类)
     */
    function openLight(Light $obj)
    {
        $obj->show();
    }
}

$user = new User();

$light = new Light();
$blueLight = new BlueLight();
$redLight = new RedLight();
$demo = new Demo();

$user->openLight($light);//灯光随机演示。
$user->openLight($blueLight);//灯光是蓝色。
$user->openLight($redLight);//灯光是红色。
$user->openLight($demo);//报错,非继承自Light类

解决二:多态之接口实现(推荐)

interface Light
{
    function show();
}

class BlueLight implements Light
{
    function show()
    {
        echo '灯光是蓝色。' . '<br>';
    }
}

class RedLight implements Light
{
    function show()
    {
        echo '灯光是红色。' . '<br>';
    }
}

class Demo
{
    function show()
    {
        echo '我不是灯光。' . '<br>';
    }
}

class User
{
    /**
     * @param $obj
     * 开灯
     * (Light $obj)限定类型为Light(之后新添颜色继承自Light类)
     */
    function openLight(Light $obj)
    {
        $obj->show();
    }
}

$user = new User();

$blueLight = new BlueLight();
$redLight = new RedLight();
$demo = new Demo();

$user->openLight($blueLight);//灯光是蓝色。
$user->openLight($redLight);//灯光是红色。
$user->openLight($demo);//报错,非继承自Light类
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值