首頁 >後端開發 >php教程 >php物件導向(介面)基礎概念與抽象類別實例介紹

php物件導向(介面)基礎概念與抽象類別實例介紹

伊谢尔伦
伊谢尔伦原創
2017-07-08 09:16:021131瀏覽

什麼是介面(interface) ?

介面是方法的抽象,如果不同的類別有相同的方法,那麼就應該考慮使用介面。 
(1)介面是一個行為的規格、協定。其實就是類別和類別之間的一種協定,一種約束
(2)C#不支援多重繼承,但是他把這個函數交給介面來實作。 
(3)類別與類別之間的系統資源呼叫方式不一樣,導致他們之間的通訊很困難,而介面可以屏蔽掉它們之間的差異,能使他們順利通訊。

(4)可以指定某個類別必須實作哪些方法,但不需要定義這些方法的具體內容。

什麼是抽象類別(abstractclass)?

1. 抽象類別僅提供一個類型的部分實作。抽象類別可以有實例變量,以及一個或多個建構函數。抽象類別可以同時有抽象方法和具體方法。一個抽象類別不會有實例,這些建構函式不能被客戶端呼叫來建立實例。一個抽象類別的建構子可以被其子類別調用,從而使一個抽象類別的所有子類別都可以有一些共同的實現,而不同的子類別可以在此基礎上有其自己的實現。

2. 抽象類別的用途1)  特定類別不是用來繼承的。 ScottMeyers曾指出,只要有可能,不要叢具體類別繼承。 2)  假設有2個具體類,類A和類B,類B是類A的子類,那麼一個最簡單的修改方案是應建立一個抽象類(或java接口)C,然後讓類A和類B成為抽象類別C的子類別。 3) 抽象類別應擁有盡可能多的共同程式碼。以提高程式碼的複用率。 4) 抽象類別應擁有盡可能少的資料。

 3. 基於抽象類別的模式與原則1) 針對抽象編程,不要針對特定編程。 2) 盡量使用合成(Composition),而不要使用繼承來達到重複使用的目的。 3) 使用摸板方法模式

4. 何時應使用繼承複用1)  子類別是超類別的一個特殊種類,而不是超類別的一個角色,也就是要區分”is– a” 和“has-a”兩種關係。 2) 永遠不會出現需要將子類別換成另一個子類別的情況。如果設計師不是很肯定一個類回不會在將來變成另一個類別的子類別的話,就不應當把這個類別設計成這個超類別的子類別。 3) 子類別具有擴展超類別的責任,而不是具有置換掉(Override)或註銷掉(Nullify)超類的責任。 4) 只有在分類學上有意義時,才可以使用繼承,不要叢工具類繼承。

抽象方法是必須實作的方法。且只能在抽象類別中。

介面與抽象類別

一個類別可以繼承多個介面。 。 。
一個類別只能繼承一個抽象類別。 。 。

抽象方法是必須實作的方法。就像動物都要呼吸。但是魚用鰓呼吸,豬用肺呼吸。 
動物類別要有呼吸方法。怎麼呼吸就是子類的事了。

現在有很多討論和建議提倡用interface代替abstract類,兩者從理論上可以做一般性的混用,但是在實際應用中,他們還是有一定區別的。抽象類別一般作為公共的父類別為子類別的擴充提供基礎,這裡的擴充包含了屬性上和行為上的。而介面一般來說不考慮屬性,只考慮方法,使得子類別可以自由的填補或擴充介面所定義的方法,就像JAVA王子所說的事件中的適配器就是一個很好的應用。
用一個簡單的例子,比如說一個教師,我們把它當作一個抽象類,有自己的屬性,比如說年齡,教育程度,教師編號等等,而教師也是分很多種類的,我們就可以繼承教師類別而擴展特有的種類屬性,而普遍屬性已經直接繼承了下來。
而接口呢~還是拿教師做例子,教師的行為很多,除了和普通人相同的以外,還有職業相關的行為,比如改考卷,講課等等,我們把這些行為定義成無body的方法,作為一個集合,它是一個interface。而教師張三李四的各自行為特徵又有不同,那麼他們就可以擴展自己的行為body。從這點意義上來說,interface偏重於行為。 
總之,在許多情況下,介面確實可以取代抽象類別,如果你不需要刻意表達屬性上的繼承的話。

介面定義了實作某種服務的一般規範,宣告了所需的函數和常數,但不指定如何實作。之所以不給出實現的細節,是因為不同的實體可能需要用不同的方式來實現公共的方法定義。關鍵是要建立必須實現的一組一般原則,只有滿足了這些原則才能說實現了這個介面。

介面中不定義類別成員!類別成員的定義完全交給實作類別來完成。

繼承更多介面

<span style="color:#000000"><span style="color:#0000bb"></span></span>

#
<?php  
interface  a{  
    public function  foo ();  
}  
interface  b{  
    public function  bar ();  
}  
//一个接口类可以继承多个接口  
interface  c  extends  a ,  b{  
    public function  baz ();  
}  
  
class  d  implements  c  
{  
    public function  foo (){  
    }  
    public function  bar (){  
    }  
    public function  baz (){  
    }  
}  
?>

PHP中不僅一個類別可以實作多個接口,也可以在繼承一個類別的同時實作多個介面, 一定要先繼承類別再去實作介面

以上是php物件導向(介面)基礎概念與抽象類別實例介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn