1. 程式人生 > 其它 >面向物件之抽象類和介面

面向物件之抽象類和介面

面向物件之抽象類和介面

問題

很多類裡面用很多方法你不斷的在重複寫。

  • 我不是可以重寫一個類每個公共類我個例項化一個這個公共類,呼叫相同的方法就可以了
  • 抽象類做的工作也就是這個,不過他省去了你例項化的這個步驟

比如人必須吃飯,約會一般要吃飯、看電影,但不一定表白

1、抽象類不能例項化

2、抽象類存在的目的是為了讓子類繼承

3、抽象類的定義和普通類的定義一樣,只不過前面加了一個關鍵字abstract

4、抽象類裡面一般都有抽象方法

抽象方法是用來讓自子類實現的,而且子類必須實現,不實現就報錯

5、抽象方法只能public或者protected

6、抽象方法如果有引數

抽象方法如果有引數,引數有預設值,那麼實現該方法的時候引數和預設值也都要有

7、抽象類可以繼承抽象類,子類在實現的時候所有的抽象方法都得實現

abstract class shopWriter{
  public function writer();
}
class XmlWriter extends shopWriter{
  public function writer(){
    ...實現具體的xml方法
  }
}
class jsonWriter extends shopWriter{
  public function writer(){
    ...實現具體的json方法
  }
}

二、介面

當有很多人一起開發一個專案時,可能都會去呼叫別人寫的一些類,那你就會問,我怎麼知道他的某個功能的實現方法是怎麼命名的呢,這個時候php介面類就起到作用了

  • interface 介面
  • implement 實現

你女朋友的爸媽的願望;有車有房有存款

  • 介面中的方法都是抽象方法,所以abstract可以省略
  • 介面中的方法必須public
  • 介面中只能規定方法,不能寫屬性
  • 一個類可以實現多個介面,中間用逗號
  • 一個類可以先繼承父類,然後再實現介面
  • 介面可以繼承介面,但是裡面的方法都要實現
Interface IFather {  
    //public $iVar1="iVar1";        此處介面定義中不能包含成員變數  
    //public static $iVar2="iVar2"; 此處介面定義中不能包含靜態變數  
    const iVar3="iVar3";  
    function iMeth1();  
}  
Class ISon implements IFather {  
    function iMeth1() {  
        echo "iMeth1...<br>";  
    }  
}  
$is=new ISon();  
echo IFather::iVar3;

介面和抽象類有什麼區別

1、定義介面的關鍵字是interface ,抽象類的關鍵字是abstract
2、抽象類和介面都不能直接例項化。
3、介面中的方法都是抽象的,抽象類中可以有方法的實現(即非抽象方法)
4、介面和抽象類中都可以定義變數,但是介面中定義的必須是公共的、靜態的、Final的,抽象類中的變數跟普通類中的沒有區別。
5、抽象類裡的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類。
6、介面是對一系列行為的抽象,而抽象類是對事物的抽象
7、抽象類可以包含靜態方法,但是介面中不可以!
8、介面中的方法必須是public的,抽象類中的方法可以使public 和 protected的
9、一個類可以實現多個介面(implement),但只能繼承一個抽象類(extends),所以一般來說,可以使用介面實現的儘量使用介面實現。

參考:https://www.cnblogs.com/yongjiapei/p/5494894.html



來自為知筆記(Wiz)