面向對象的特性:多態性

1、抽象方法和抽象類程序員

1.抽象方法:一個方法若是沒有方法體(沒有{},直接分號結束,使用abstrract關鍵字修飾的方法),便是抽象方法code

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();//吃米飯

2、面向對象的接口技術io

1.接口是一種特殊的抽象類(有抽象類全部特性)function

2.接口與通常抽象類的區別(接口也是一種規範)class

a.接口內全部方法必須全是抽象方法
b.接口中屬性必須是常量(const聲明)
c.接口內權限必須是public(默認便是,沒必要聲明),抽象類能夠有protected
d.聲明接口不使用class,而是interface
e.接口中的抽象方法不須要abstract特殊聲明,由於都是
f.能夠用類::訪問屬性/方法
interface Demo {
    const NAME="wo";
    function test();
}

3.接口的特性test

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

3、多態性(各個子類的形態功能不一樣)擴展

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();    
    //加載鼠標成功!
    //運行鼠標功能!
    //鼠標工做結束!
    //加載鍵盤成功!
    //運行鍵盤功能!
    //鍵盤工做結束!
相關文章
相關標籤/搜索