zoukankan      html  css  js  c++  java
  • PHP面向对象05_接口与多态

    抽象类与接口

    2014-9-2 9:14:32

    摘要:
    1、抽象类(abstract)
    2、接口(interface)
    3、多态的应用

    1、抽象类(abstract)

    特点:
    1)抽象类使用abstract关键字申明
    2)抽象类中可以没有抽象方法
    3)任何一个类,如果它里面至少有一个抽象方法,那么这个类就必须被声明为抽象的
    4)抽象方法没有方法体,直接分号(;)结束,,使用abstract关键字申明
    5)抽象方法不能被实例化,只能被继承(extends);子类必须重载抽象类中所有抽象方法

    作用:
    1)定义一个规范,具有约束性,强制要求子类定义这些方法(父类中的抽象方法)

    注意:
    1)继承一个抽象类的时候,子类必须定义父类中的所有抽象方法
    2)这些重载的方法的访问控制必须和父类中一样(或者更为宽松)
    例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的
    3)此外方法的调用方式必须匹配,即类型和所需参数数量必须一致
    例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。

    示例:

    abstract class Demo{
        prviate $param;
        public abstract function fun();//定义了一个抽象方法,必须重载使用
        public function test(){
        //...
        }
    }
    
    class SubDemo extends Demo{
        public function fun(){
        //...
        }
    }

    2、接口(interface)

    接口与抽象类很像,都是约束作用,只是接口里面的方法全部是抽象的,且不需要使用abstract申明;
    接口使用interface申明

    特点:
    1)接口使用interface申明
    2)接口中的方法全部是抽象的,不需要使用abstract申明
    3)接口不能被实例化,必须被引用(implements,同抽象类中的继承)使用
    4)子类可以引用多个接口,用逗号(,)隔开

    作用:
    1)定义一个规范,具有约束性
    2)使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容

    注意:
    1)要实现一个接口,使用implements操作符
    2)类中必须实现接口中定义的所有方法,否则会报一个致命错误
    3)类可以实现多个接口,用逗号来分隔多个接口的名称
    4)实现多个接口时,接口中的方法不能有重名
    5)接口也可以继承,通过使用extends操作符

    示例:

    interface Db{
        public function select();
        public function findAll();
        public function find();
        public function insert();
        public function update();
        public function delete();
    }

    3、多态的应用
    对象的多态性是指在父类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为.
    这使得同一个属性或行为在父类及其各个子类中具有不同的语义.
    例如生活中的USB就可以实现多态功能:插入U盘和鼠标都能正常工作,且完成各自的工作,但内部肯定有一致的规范定义

    示例:

    <?php
    //定义一个外围控制接口PCI
    interface PCI{
        //该PCI必须有以下功能
        public function init();
        public function stop();
    }
    
    //定义主板类
    class MainBorad{
        public function work(PCI $m){//类型约束,必须传入对象
            $m->init();
            $m->stop();
        }
    }
    
    //定义声卡引用PCI规范
    class SoundCard implements PCI{
        public function init(){
            echo "声卡正在初始化...<br>";
        }
        public function stop(){
            echo "声卡正在停止...<br>";
        }
    }
    
    //定义网卡引用PCI规范
    class NetworkCard implements PCI{
        public function init(){
            echo "网卡正在初始化...<br>";
        }
        public function stop(){
            echo "网卡正在停止...<br>";
        }
    }
    
    $sys = new MainBorad();
    $sys->work(new SoundCard);//传入声卡对象
    $sys->work(new NetworkCard);//传入网卡对象
    ?>



  • 相关阅读:
    虚拟DOM和diff算法
    面向对象之封装
    面向对象之类和函数的属性
    面向对象之__init__方法
    面向对象之初始类和对象
    面向对象与面向过程详解
    CSS高级技巧
    CSS定位
    模块之re模块详解
    模块之logging模块详解
  • 原文地址:https://www.cnblogs.com/52fhy/p/3969354.html
Copyright © 2011-2022 走看看