一、抽象方法和抽象类

1.抽象方法:一个方法如果没有方法体(没有{},直接分号结束,使用abstrract关键字修饰的方法),即是抽象方法

2.抽象类:如果类中有一个方法是抽象方法,则这个类是抽象类,该类使用abstract来修饰

注意:

1.抽象类中不一定必须有方法
2.抽象类中有抽象方法
3.抽象类不能创建对象
4.其他方面与一般类完全一样
5.抽象类必须有子类,子类将抽象类的抽象方法覆盖,就有方法体了
6.子类必须覆盖全部抽象方法,才能创建对象,如果只实现部分抽象方法,则子类还是抽象类

3.抽象方法的作用:规定了子类必须有(覆盖)这个方法,具体功能交给子类(按自己的功能)实现
4.抽象类的作用:抽象类要求了子类的结构,就是一个规范(程序员不能不写某种方法)

    abstract class Person {
        abstract function eat();
        abstract function sleep();
        function walk(){}
    };
    class Men extends Person {
        function eat(){
            echo "吃米饭<br>";
        }
        function sleep(){
            echo "睡床<br>";
        }
    };
    class Women extends Person {
        function eat(){
            echo "吃面<br>";
        }
        function sleep(){
            echo "睡床<br>";
        }
    };    
    $s=new Men;
    $s->eat();//吃米饭

二、面向对象的接口技术

1.接口是一种特殊的抽象类(有抽象类所有特性)

2.接口与一般抽象类的区别(接口也是一种规范)

a.接口内所有方法必须全是抽象方法
b.接口中属性必须是常量(const声明)
c.接口内权限必须是public(默认即是,不必声明),抽象类可以有protected
d.声明接口不使用class,而是interface
e.接口中的抽象方法不需要abstract特殊声明,因为都是
f.可以用类::访问属性/方法
interface Demo {
    const NAME="wo";
    function test();
}

3.接口的特性

a.接口可以继承另一个接口(extends),但只有扩展关系,没有覆盖关系
b.可以使用一般类实现接口的*全部方法*(抽象方法必须全部覆盖),即有覆盖关系
c.可以使用抽象类来实现接口的*部分方法*,即有覆盖关系
d.只要是覆盖关系,即使用类/抽象类来实现接口,就要用implements关键字
e.extends:一个类只能有一个父类
f.implements:可以在使用extends继承其他类的同时,进行对接口的实现,可以实现多个接口(一定要先extends,再implements)
g.实现多个接口,以逗号分开多个接口名即可

    interface Demo {
        const NAME="wo";
        function test1();
        function test2();
    };
    interface Test extends Demo {
        function test3();
    };
    class World {
        function test4(){
            
        }
    };
    interface Abc {
        function test5();
    }
    class Fina extends World implements Test,Abc {
        function test1(){
            echo "test1<br>";
        }
        function test2(){
            echo "test2<br>";
        }
        function test3(){
            echo "test3<br>";
        }
        function test4(){
            echo "test4<br>";
        }
        function test5(){
            echo "test5<br>";
        }
    };
    $p=new Fina;
    $p->test1();//test1
    $p->test2();//test2
    $p->test3();//test3
    $p->test4();//test4
    $p->test5();//test5    

三、多态性(各个子类的形态功能不同)

1.必须有继承关系,父类最好是接口或抽象类,如下为模拟USB接口下鼠标和键盘的多态,以及使用者进行调用的情况
    interface USB {
        const WIDTH = 12;
        const HEIGHT = 3;
        function load();
        function run();
        function stop();
    };
    class Mouse implements USB {
        function load(){
            echo "加载鼠标成功!<br>";
        }
        function run(){
            echo "运行鼠标功能!<br>";
        }
        function stop(){
            echo "鼠标工作结束!<br>";
        }
    };
    class Keyboard implements USB {
        function load(){
            echo "加载键盘成功!<br>";
        }
        function run(){
            echo "运行键盘功能!<br>";
        }
        function stop(){
            echo "键盘工作结束!<br>";
        }
    };
    class Computer {
        //只要是继承自USB抽象类的对象,不论什么设备,都执行三个方法
        function useUSB(USB $usb){
            $usb->load();
            $usb->run();
            $usb->stop();
        }
    };
    class Workers {
        function work(){
            $c=new Computer;
            $m=new Mouse;
            $k=new Keyboard;
            $c->useUSB($m);
            $c->useUSB($k);
        }
    };
    $w=new Workers;
    $w->work();    
    //加载鼠标成功!
    //运行鼠标功能!
    //鼠标工作结束!
    //加载键盘成功!
    //运行键盘功能!
    //键盘工作结束!

1111
93 声望10 粉丝