首页> 基础笔记 >PHP基础学习 >面向对象 面向对象

PHP面向对象多态性的应用

作者:小萝卜 2019-09-05 浏览 1239

简介对象的多态性是指在父类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在父类及其各个子类中具有不同的语义。通过接口实现多态的应用,通过抽象类实现多态的应用,通过普通类实现多态的应用。

PHP面向对象多态性的应用

对于同一个方法,传入不同对象,实现了不同的效果,这个就是多态。需要使用的技术有继承或实现方法的覆盖(重写)。

对象的多态性是指在父类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在父类及其各个子类中具有不同的语义。

 例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。

通过接口实现多态的应用1;

<?php   
    //定义一个USB接口,让每个USB设略都遵守这个规范
    interface USB {
        function run();
    }
    
    //声明一个电脑类, 去使用USB设置
    class Computer {
        //电脑类中的一个方法可以应用任何一种USB设备
        function useUSB($usb) {
            $usb -> run();
        }
    }
    
    $computer = new Computer;                   //实例化一个电脑类的对象         
    
    $computer ->useUSB( new Ukey() );       //为电脑插入一个USB键盘设备,并运行
    $computer ->useUSB( new Umouse() );  //为电脑插入一个USB鼠标设备,并运行
    $computer ->useUSB( new Ustore() );     //为电脑插入一个USB存储设备,并运行

    //扩展一个USB键盘设置,实现USB接口
    class Ukey implements USB {
        public function run() {	 //按键盘的功能实现接口中的方法
            echo "运行USB键盘设备<br>";
        }
    }
    
    //扩展一个USB鼠标设置,实现USB接口
    class Umouse implements USB {  
        public function run() {  	 //按鼠标的功能实现接口中的方法
            echo "运行USB鼠标设备<br>";
        }
    }
    
    //扩展一个USB存储设置,实现USB接口
    class Ustore implements USB {
        public function run() {	 //按存储的功能实现接口中的方法
            echo "运行USB存储设备<br>";
        }
    }


通过接口实现多态的应用2:

<?php
//1. 通过接口实现多态的应用

//主板:
//定义主板上PCI接口规范
interface PCI{
    public function start();
    public function stop();
}

//主板类
class MainBoard{
    //此处为多态的应用,方法要求传入一个PCI但是实际传入的是声卡或网卡等设备对象,导致执行效果的不同,即为多态效果。
    public function running(PCI $pci){
        $pci->start();
        $pci->stop();
    }
}

//声卡
class SoundCard implements PCI{
    public function start(){
        echo "声卡启动...<br/>";
    }
    public function stop(){
        echo "声卡停止...<br/>";
    }
}

//网卡
class NetworkCard implements PCI{
    public function start(){
        echo "网卡启动...<br/>";
    }
    public function stop(){
        echo "网卡停止...<br/>";
    }
}

//系统
$mb = new MainBoard();
$sc = new SoundCard();
$nc = new NetworkCard();

$mb->running($sc);
$mb->running($nc);


通过抽象类实现多态的应用:

<?php
//1. 通过抽象类实现多态的应用

//主板:
//定义主板上抽象PCI类规范
abstract class PCI{
    public abstract function start();
    public abstract function stop();
}

//主板类
class MainBoard{
    //此处为多态的应用,方法要求传入一个PCI但是实际传入的是声卡或网卡等设备对象,导致执行效果的不同,即为多态效果。
    public function running(PCI $pci){
        $pci->start();
        $pci->stop();
    }
}

//声卡
class SoundCard extends PCI{
    public function start(){
        echo "声卡启动...<br/>";
    }
    public function stop(){
        echo "声卡停止...<br/>";
    }
}

//网卡
class NetworkCard extends PCI{
    public function start(){
        echo "网卡启动...<br/>";
    }
    public function stop(){
        echo "网卡停止...<br/>";
    }
}

//系统
$mb = new MainBoard();
$sc = new SoundCard();
$nc = new NetworkCard();

$mb->running($sc);
$mb->running($nc);


通过普通类实现多态的应用(不推荐)

<?php
//1. 通过普通类实现多态的应用(不推荐)

//主板:
//定义主板上PCI类规范(此规范对子类没有约束能力)
class PCI{
    public function start(){
    
    }
    public function stop(){
    
    }
}

//主板类
class MainBoard{
    //此处为多态的应用,方法要求传入一个PCI但是实际传入的是声卡或网卡等设备对象,导致执行效果的不同,即为多态效果。
    public function running(PCI $pci){
        $pci->start();
        $pci->stop();
    }
}

//声卡
class SoundCard extends PCI{
    public function start(){
        echo "声卡启动...<br/>";
    }
    //此处没有按照父类的方法重写,导致声卡无法停止。
    public function stop2(){
        echo "声卡停止...<br/>";
    }
}

//网卡
class NetworkCard extends PCI{
    public function start(){
        echo "网卡启动...<br/>";
    }
    public function stop(){
        echo "网卡停止...<br/>";
    }
}

//系统
$mb = new MainBoard();
$sc = new SoundCard();
$nc = new NetworkCard();

$mb->running($sc);
$mb->running($nc);

 

很赞哦! (0)

文章评论

    高端网站建设