对象的多态特性

一、抽象类和接口

  1、抽象类

    1)什么是抽象类?

      抽象类就是包含抽象方法的类

      抽象类其实就是一种规范

      具有抽象方法的类一定是抽象类

    2)什么是抽象方法?

      没有实现的成员方法,但是又给我们指引了一个目标

    3)为什么要使用抽象类

      要为之后的程序定义规范

    4)什么时候使用抽象类

      在需要对程序进行规范性定义时

    5)如何声明抽象类

      使用 abstract 声明一个抽象类

      含有抽象方法的类一定是抽象类

      抽象类不一定包含抽象方法

      抽象方法一定要使用 abstract 关键字进行声明,该方法一定没有方法体,以分号结尾

      抽象方法不能声明为私有的或是 final 修饰的

      抽象类不允许直接使用(实例化)

      抽象类要使用必须利用子类继承并在子类中将抽象方法一次性全部实现后,方可使用这些成员方法

      抽象类中的抽象方法的声明格式在利用子类继承并实现方法时的格式必须保持一致(参数个数、是否为静态)

//声明一个抽象类,具有抽象方法的类一定是抽象类,必须使用“abstract”来声明
abstract class Person{
    private $name="autumn";
    private $sex="男";
    private $age=25;

    public function info(){
        echo "姓名:".$this->name.",性别:".$this->sex.",年龄:".$this->age;
    }

    public function say(){
        echo "haha";
    }

    //声明抽象方法
    abstract public function sleep();

    abstract public function eat();
}
//抽象类不允许直接被实例化使用
//只有所有的抽象方法在子类中全部同时被实现了,这些方法才可使用
class Admin extends Person
{
    public function sleep(){
        echo "我爱睡懒觉";
    }
    
    public function eat(){
        echo "我爱吃肉";
    }
    
}

$p=new Admin;
$p->sleep();

  2、接口

    1)什么是接口?

      所有的成员方法都为抽象方法的抽象类

    2)为什么要使用接口?

      定义一种都无法实现的规范

    3)如何使用接口

      使用 interface 关键字进行接口的声明,而不是class,后跟接口名

      接口当中不允许包含成员属性

      接口当中的成员方法必须是未实现的方法,无需使用 abstract 声明

      接口不允许直接实例化

      继承接口使用 implements 而不是extends

      一个类可以继承多个接口,接口和接口之间使用“,”分隔

      一个类只允许继承一个父类,若要同时继承一个父类和多个接口,要先继承类再继承接口

interface Person{
    //接口不允许包含成员属性
    //private $name="autumn";

    //接口可以定义常量
    const DB_HOST="localhost";

    //成员方法不需要使用abstract声明
    function sleep();
    function eat(); 
}

interface Play{
    function play();
}

interface Sport{
    function sport();
}

class Boy{
    public function boy(){
        echo "i am a boy";
    }
}

//接口不允许直接被实例化使用
//只有所有的抽象方法在子类中全部同时被实现了,这些方法才可使用
//一个类可以同时继承多个接口,但只能继承一个类
class Admin extends Boy implements Person,Play,Sport{
    function sleep(){
        echo "我爱睡懒觉";
    }
    
    function eat(){
        echo "我爱吃肉";
    }

    function play(){
        echo "我不爱玩游戏";
    }

    function sport(){
        echo "我爱运动";
    }
}

$p=new Admin;
$p->sleep();
$p->sport();

  3、抽象类和接口的区别

    1)抽象类使用 abstract 声明,接口使用 interface 声明

    2)接口当中的方法一定都是抽象方法,抽象类当中的方法不一定全都是抽象方法

    3)接口和抽象类都是对子类定义一种规范而产生的

    4)接口是抽象类的特殊情况

    5)继承接口使用 implements ,继承抽象类使用 extends

    6)接口可以被同时继承多个,而抽象类只能一次被继承一个

二、对象的多态

  1、什么是多态?

    声明的类可以表现出多种形态或者行为

  2、为什么要使用多态?

    可以使代码更加简便或具有更高的可重用性,让程序具有高可扩展性

  3、什么时候使用多态?

    给程序留出一定的接口,调用不同的类,实现不同的功能

interface Usb{
    function start();
    function run();
    function stop();
}

class UDisk implements Usb{
    public function start(){
        echo "U盘开始...";
    }
    public function run(){
        echo "U盘运行...";
    }
    public function stop(){
        echo "U盘结束...";
    }
}

class UMouse implements Usb{
    public function start(){
        echo "鼠标开始...";
    }
    public function run(){
        echo "鼠标运行...";
    }
    public function stop(){
        echo "鼠标结束...";
    }
}

class UCamera implements Usb{
    public function start(){
        echo "摄像头开始...";
    }
    public function run(){
        echo "摄像头运行...";
    }
    public function stop(){
        echo "摄像头结束...";
    }
}

//未继承接口的类
class UFan{
    public function start(){
        echo "风扇开始...";
    }
    public function run(){
        echo "风扇运行...";
    }
    public function stop(){
        echo "风扇结束...";
    }
}

class Computer{
    //类型约束,约束实例化对象必须为继承自Usb类的子类所实例化的
    public function useUsb(Usb $obj){
        $obj->start();
        $obj->run();
        $obj->stop();
    }
}


$c=new Computer;
$c->useUsb(new UCamera);
echo "<hr>";
$c->useUsb(new UFan);  //会报错
原文地址:https://www.cnblogs.com/zhouwanqiu/p/9588765.html