(42)抽象類和抽象方法的應用(43)接口與面向對象中多態的應用

 (42)抽象類和抽象方法的應用
抽象類 接口 多態

  抽象類是一種特殊的類, 接口是一種特殊的抽象類, 而多態就要使用到抽象類或是接口

 聲明抽象類和接口,以及一些需要的技術
 
   抽象類
 
 什麼是抽象方法?
 
  定義:如果一個類中的方法,沒有方法體的方法就是抽象方法(就是一個方法沒有使用


{}而直接使用分號結束)
     
      abstract function test();  //抽象方法

function test(){  //有方法體,但方法體爲空的

}


如果一個方法是抽象方法,就必須使用abstract修飾
 
爲什麼要使用抽象方法?
     
       什麼是抽象類?
 
     abstract class Demo {
abstract function test();  //真正的抽象類
      }
  1. 如果一個類中,有一個方法是抽象的則這個類就是抽象類
  2. 如果一個類是抽象類,則這個類必須要使用abstract修飾
  3. 抽象類是一種特殊的類,就是因爲一個類中有抽象方法,其他不變。也可以


在抽象類中聲明成員屬性,常量,非抽象的方法。
  4. 抽象類不能實例化對象(不能通過抽象類去創建一個抽象類的對象)
 
 我們面臨的兩個疑問:
 一、抽象方法沒有方法體,不知道做什麼的(相當於沒寫功能)
 二、對象中的方法和屬性都要通過對象來訪問,除常量和靜態的變量和方法, 而抽象類


又不能創建對象,抽象類中的成員都不能直接訪問
 
接口
 
 作用:
    要想使用抽象類,就必須使用一個類去繼承抽象類,而且要想使用這個子類,也


就是讓子類可以創建對象,子類就必須不能再是抽象類, 子類可以重寫父類的方法(給


抽象方法加上方法體相當於覆蓋)
 
 抽象方法中的方法沒有方法體, 子類必須實現這個方法 (父類中沒寫具體的實現, 但


子類必須有這個方法名)
 
 
 就是在定義一些規範,讓子類按這些規範去實現自己的功能
 
 目的: 就是要將你自己寫的程序模塊 加入 到原來已經寫好的程序中去 (別人寫好的


程序,不能等你開發完一個小模塊,根據你的小模塊繼續向後開如)
 
  多態
 

一、abstract class Demo {
var $name;
var $age;

abstract function test();
abstract function fun();


function say(){
echo "#############33";
}


function run(){

}
}


class Hello extends Demo {       //繼承以上的抽象類
function test() {       //覆蓋以上抽象方法的子類
echo "子類要完成的任務1";
}
function fun(){
echo "了類中另一個實現";
}
}


$h=new Hello;


$h->test();










二、abstract class FileDir {
var $filename;
var $time;


function getName(){    //這兩個方法是公用的
echo "獲取文件和目錄的名子<br>";
}


function getTime(){     //公用的方法
echo "獲取文件和目錄的創建時間<br>";
}


abstract function getSize();
abstract function copy();
abstract function remove();
abstract function delete();


}


             //文件的類
class FileClass extends FileDir {     //繼承以上的抽象類
function getSize(){          //以下幾個子類來覆蓋上面的抽象


子類
echo "獲取文件的大小<br>";
}


function copy(){
echo "複製文件<br>";
}


function remove(){
echo "移動文件<br>";
}


function delete(){
echo "刪除文件<br>";
}
}




             //目錄的類
class DirClass extends FileDir {
function getSize(){
echo "獲取目錄的大小<br>";
}


function copy(){
echo "複製目錄<br>";
}


function remove(){
echo "移動目錄<br>";
}


function delete(){
echo "刪除目錄<br>";
}
}



$fd= new DirClass;   //調用目錄(我們還可以$fd= new FileClass;調用


文件。就這樣我們可以調用第三方的類)



$fd->getName();
$fd->getSize();
$fd->copy();
$fd->remove();
$fd->delete();

$fd->getTime();





(43)接口與面向對象中多態的應用
接口技術
 
  接口中一種特殊的抽象類, 抽象類又是一種特殊的類
 
 
  接口和抽象類是一樣的作用
 
  因爲在PHP是單繼承的, 如果使用抽象類,子類實現完抽象類就不能再去繼承其它的類了。
 
  如果即想實現一些規範, 又想繼承一個其他類。就要使用接口
 
    接口和抽象類的對比
 
相同點 1. 作用相同,都不能創建對象, 都需要子類去實現
不同點 2. 接口的聲明和抽象類不一樣
       3. 接口被實現的方式不一樣
 
       4. 接口中的所有方法必須是抽象方法,只能聲明抽象方法(不用使用abstract修飾)
       5. 接口中的成員屬性,只能聲明常量,不能聲明變量
 
       6. 接口中的成員訪問權限 都必須是public, 抽象類中最低的權限protected
 
       7. 使用一個類去實現接口, 不是使用extends關鍵字, 而是使用implements這個詞


 如果子類是重寫父接口中抽象方法,則使用implements, 類--接口, 抽象類---接口 implements 接口---接口 extends
 
   可以使用抽象類去實現接口中的部分方法
   如果想讓子類可以創建對象,則必須實現接口中的全部抽象方法
  
  可以定義一個接品口去繼承另一個接品口


   一個類可以去實現多個接口(按多個規範去開發子類), 使用逗號分隔多個接口名稱


   一個類可以在繼承一類的同時,去實現一個或多個接口(先繼承,再實現)


   使用implements的兩個目的
    1. 可以實現多個接口 ,而extends詞只能繼承一個父類
    2. 沒有使用extends詞,可以去繼承一個類, 所以兩個可以同時使用
 
     class 類名{
 
     }
 
     abstract class 類名 {
 
     }
 
    聲明方式
 
    interface 接口名{    //接口只能用這個聲明
 
    }
  
 
 


  interface Demo {
 const HOST="localhost";   //定義常量,接口處不可以定義變量
 const USER="Admin";


           function  fun1();  //不可以設置私有或者保護狀態
           function  fun2();  //接口處只可以定義以上一種與這種的兩種方法


 /*          function  fun3(){    //不可以的,方法不能有體
}
*/
  }


            echo Demo::HOST;




interface Demo2 extends Demo {    //類繼承接口不可以用extends而是用implements(實現)但是接口繼承接口用extends就可以了
  function fun3();


function fun4();   
  }


  interface Demo3 {
  function fun5();  
function fun6();   
  }
  interface Demo4{
  function fun7();
  }
class hello{
      function fun8(){
         
            }
   }
   class test  extend  hello implements Demo2,Demo3,Demo4{  //一個類可以在繼承一類的同時,去實現一個或多個接口(先繼承,再實現)


         function  fun1(){   //一個類可以去實現多個接口(按多個規範去開發子類), 使用逗號分隔多個接口名稱
}
         function  fun2(){
}
         function  fun3(){

         function  fun4(){
}
         function  fun5(){
}
         function  fun6(){
}
          function  fun7(){
}
         function  fun8(){
}




}




 多態:  多態是面向對象的三大特性之一
 
“多態”是面向對象設計的重要特性,它展現了動態綁定(dynamic binding)的功能,也稱爲“同名異式”(Polymorphism)。多態的功能可讓軟件在開發和維護時,達到充分的延伸性(extension)。事實上,多態最直接的定義就是讓具有繼承關係的不同類對象,可以對相同名稱的成員函數調用,產生不同的反應效果。


 interface Test {
    function aaa();
function bbb();
   }




  class One implements Test{
  function aaa(){
echo "AAAAAAAAAAAAAAAAA<br>";
}


function bbb(){
echo "BBBBBBBBBBBBBBBBBB<br>";
}
  }


  class Two implements Test {
  function aaa(){
echo "11111111111111111111<br>";
}


function bbb(){
echo "222222222222222222222222<br>";
}
  }
   
   $a=new one;  //輸出AAAAAAA/BBBBBBB如果將one改成two那麼就是輸出來111111/2222實現了對相同名稱的成員函數調用,產生不同的反應效果。那麼怎麼統一調用多個方法呢?就需要統一調用相同的接口或者相同的規範。還有多個類必須有相同的對象方法。


   $a->aaa();
   $a->bbb();










用開發電腦的統一USB接口作爲例子
interface  USB {
function mount();  //掛載
function work();
function unmount();   //卸載
}




class Upan implements USB {    //實現USB
function mount(){
echo "U 盤掛載成功, 可以使用<br>";
}


function work(){
echo "U 盤開始工作<br>";
}


function unmount(){
echo "U 盤卸載成功<br>";
}
}


class FengShan implements USB {
function mount(){
echo "風扇 掛載成功, 可以使用<br>";
}


function work(){
echo "小風扇開始吹小風<br>";
}


function unmount(){
echo "風扇卸載成功<br>";
}
}






class DianNao {
function  useUSB($usb){  //多態的用法
$usb->mount();
$usb->work();
$usb->unmount();
}
}


class Worker {
function install(){    //開始安裝


//找到電腦,定義一個電腦的對象
$dn=new DianNao;


//拿過來一些USB設備
$up=new Upan;
$fs=new FengShan;


//向電腦是插入USB設備
$dn->useUSB($fs);
$dn->useUSB($up);//插入兩個設備,既可以使用U盤,又可以吹風


}
}




$ren=new Worker;


$ren->install();




查閱單態、工廠的相關資料
















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章