摘要:關于抽象類和接口的初步理解什么是抽象類抽象類是指在前加了關鍵字且存在抽象方法在類方法關鍵字前加了關鍵字的類。抽象類不能被直接實例化。抽象類中只定義或部分實現子類需要的方法。抽象類提供了具體實現的標準,而接口則是純粹的模板。
關于抽象類和接口的初步理解 什么是抽象類
抽象類是指在 class 前加了 abstract 關鍵字且存在抽象方法(在類方法 function 關鍵字前加了 abstract 關鍵字)的類。
抽象類不能被直接實例化。抽象類中只定義(或部分實現)子類需要的方法。子類可以通過繼承抽象類并通過實現抽象類中的所有抽象方法,使抽象類具體化。
如果子類需要實例化,前提是它實現了抽象類中的所有抽象方法。如果子類沒有全部實現抽象類中的所有抽象方法,那么該子類也是一個抽象類,必須在 class 前面加上 abstract 關鍵字,并且不能被實例化。
引用鏈接
接口(Interface)—— 定義行為
抽象類(Abstract Class) —— 實現行為
具體類(class)——執行行為
引用鏈接
抽象類就是一個類的服務提供商,擁有眾多服務,你不用必須用,當需要的時候你來用就可以,如果你覺得不提供服務不滿意,你還可以自己來做。
抽象方法是必須實現的方法。就象動物都要呼吸。但是魚用鰓呼吸,豬用肺呼吸。
動物類要有呼吸方法。怎么呼吸就是子類的事了。
引用鏈接
為什么要使用抽象類按照我目前的知識理解:
保持程序的一致性
抽象類限制了實現的方法,也是為了保持一致性
增加代碼重用性,例如一些公共類不需要實現,只需要調用里面的方法就可以了。
現在有很多討論和建議提倡用interface代替abstract類,兩者從理論上可以做一般性的混用,但是在實際應用中,他們還是有一定區別的。抽象類一般作為公共的父類為子類的擴展提供基礎,這里的擴展包括了屬性上和行為上的。而接口一般來說不考慮屬性,只考慮方法,使得子類可以自由的填補或者擴展接口所定義的方法,就像JAVA王子所說的事件中的適配器就是一個很好的應用。
用一個簡單的例子,比如說一個教師,我們把它作為一個抽象類,有自己的屬性,比如說年齡,教育程度,教師編號等等,而教師也是分很多種類的,我們就可以繼承教師類而擴展特有的種類屬性,而普遍屬性已經直接繼承了下來。
而接口呢~還是拿教師做例子,教師的行為很多,除了和普通人相同的以外,還有職業相關的行為,比如改考卷,講課等等,我們把這些行為定義成無body的方 法,作為一個集合,它是一個interface。而教師張三李四的各自行為特點又有不同,那么他們就可以擴展自己的行為body。從這點意義上來說,interface偏重于行為。
引用鏈接
怎樣使用抽象類color = $color; } public function getColor() { //只是為了演示需要的一個方法 return $this->color; } abstract public function getArea(); //構造方法是為了限制代碼,對于繼承這個構造類的子類,必須限制擁有這個構造方法,主要為了保持代碼一致性。 } class Square extends Shape{ protected $length = 4; public function getArea() { return pow($this->$length, 2); } } class Circle extends Shape{ //這里因為沒有構造方法getArea,所以代碼允許會報錯的。 } $shape = new Square(); var_dump($shape); ?>接口和抽象類
抽象類不能被直接實例化,抽象類中只定義子類需要的方法,子類可以繼承并且通過實現其中的抽象方法,使抽象類具體化。例如一個名為media的類,他是用于描述各種公開出版的共同性質,因為media不表示真實的實體,而是一些相似實體的泛化表示,所以不實例化,這樣就需要聲明為抽象類,然后再由各種的派生的Media類繼承此抽象類
抽象類的每個子類都必須實現抽象類中的所有抽象方法,或者把他們自身也聲明為抽象方法。
擴展類不僅僅負責簡單實現抽象類的方法,還必須重新聲明方法,新的方法不能比抽象方法的訪問控制更嚴格,新的實現方法的參數個數應該和抽象方法的參數個數一樣。
接口定義了實現某種服務的一般規范,聲明了必須的函數和常量,但是不指定如何實現。關鍵是要建立必須實現的一組一般原則,只有滿足了這些原則才能說實現了這個接口。
抽象類提供了具體實現的標準,而接口則是純粹的模板。接口只能定義功能而不包含實現的內容。
任何實現接口的類都要實現接口中所定義的所有方法,否則類必須聲明為abstract。
實現接口的類接受他的繼承的類以及實現的接口的類型。
什么時候用接口,什么時候用抽象類如果要創建一個模型,這個模型將由一些緊密相關的對象引用,就可以采用抽象類,如果要創建將由一些不想關的對象采用的功能,應該用接口。
如果必須從多個來源繼承行為,就是用接口。
如果知道所有類都會共享一個公共的行為實現,就使用抽象類,并在其中實現行為。接口無法實現。
一個類只能extends一個父類,但可以貫徹多個接口。
接口作用一:接口類就是一個類的領導者,指明方向,子類必須完成它指定方法。
當有很多人一起開發一個項目時,可能都會去調用別人寫的一些類,那你就會問,我怎么知道他的某個功能的實現方法是怎么命名的呢,這個時候php接口類就起到作用了,當我們定義了一個接口類時,它里面的方式是下面的子類必須實現的,比如
interface Shop { public function buy($gid); public function sell($gid); public function view($gid); }
class BaseShop implements Shop { public function buy($gid) { echo "你購買了ID為 :" . $gid . "的商品"; } public function sell($gid) { echo "你購賣ID為 :" . $gid . "的商品"; } public function view($gid) { echo "你瀏覽了ID為 :" . $gid . "的商品"; } }接口作用二:
有時候,我們需要設計一個物品,比如shape,這個shape有不同的形狀,有不同的顏色,可作不同的運動,等等。當然我們可以把這些都放在一個類里面,但這樣,如前面說的,只是過程編程,不是OO編程。你會說,像上面例子一樣,做一個抽象類,然后在子類里實現所有的功能。好象不錯,進步了。這樣子類里面要實現形狀,顏色,運動等功能,OK嗎?記住,OO里面還有一條原則,為了最大程度的做到代碼重用,一個類里最好只實現一個功能,也就是說,一個類做形狀,一個類做顏色,一個類做運動 。這樣如果其他的類要用到顏色的功能時,我們就可以重用這個顏色類,同理,這樣我們可以很容易的重用運動類,形狀類,等等。
但這樣問題出來了,現在我們要用到上面所有的功能,但又分散在三個類里面,怎么辦?這時我們就要用到抽象類和接口了。選定一個跟shape關聯最大的一項–形狀,把它做成抽象類, 其他兩樣,把它們做成接口,然后在子類里面extends一個抽象類,再implements兩個接口就行了。如:
class Square extends Shape implements 顏色, 運動, ... { ... }抽象類作用一:
抽象類就是一個類的服務提供商,擁有眾多服務,你不用必須用,當需要的時候你來用就可以,如果你覺得不提供服務不滿意,你還可以自己來做。
這里是一個例子,想上面一樣我定義了一個商店類,抽所了它所有像的部分,買(buy),賣(sell),看(view),并且抽象類里都實現了這些方法,那么繼承它的子類就自動獲得了這些方法,子類就做它自己獨特的東西,減少代碼的重復,提高復用性。
abstract class BaseShop { public function buy($gid) { echo "你購買了ID為 :" . $gid . "的商品"; } public function sell($gid) { echo "你購賣ID為 :" . $gid . "的商品"; } public function view($gid) { echo "你瀏覽了ID為 :" . $gid . "的商品"; } } class BallShop extends BaseShop { var $itme_id = null; public function __construct() { $this->itme_id = 2314; } public function open() { $this->sell($this->itme_id); } }抽象類作用二:
在抽象類里面設置抽象方法
在oo設計時,會把一些通用的方法放在一個類里,但考慮到子類繼承時的差異性,又不能把它事先實現,就只好用到這個抽象類或接口了。這里很清楚的顯示了在抽象類里,我們貫徹了設原用到點setCenter()的方法,這樣,當子類繼承它時,就不用再重復寫這個設原點的方法了。那么為什么draw的方法要設定成抽象方法呢?這是因為不同的子類要用不同的實現方法。
abstract class Shape { function setCenter($x, $y) { $this->x = $x; $this->y = $y; } abstract function draw(); protected $x, $y; }
參考:http://chengxudaren.com/index.php?act=article&op=detail&a_id=152
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/22503.html
摘要:反對者在某些領域對此予以否認。下面再引用一段來自維基百科中關于的歷史。類的更嚴格的定義是由某種特定的元數據所組成的內聚的包。類還可以有運行時表示形式元對象,它為操作與類相關的元數據提供了運行時支持。 在開始部分,請看官非常非常耐心地閱讀下面幾個枯燥的術語解釋,本來這不符合本教程的風格,但是,請看官諒解,因為列位將來一定要閱讀枯燥的東西的。這些枯燥的屬于解釋,均來自維基百科。 1、問題...
摘要:是一種典型的面向對象編程語言。這篇文章主要是來初步理解一下面向對象的思維為下面的內容先給一個基礎。針對面向對象編程的更多內容,會在后面的文章里面詳細解釋。他們都稱之為對象。之后,我們再用編程語言,把這種映射編寫出來,就是的面向對象編程啦。 showImg(https://segmentfault.com/img/remote/1460000012983458?w=900&h=500);...
摘要:例如汽車這個名詞可以理解為汽車的總類,但這輛寶馬汽車則是一個具體的汽車對象。當在類成員方法內部調用的時候,可以使用偽變量調用當前對象的屬性。在面向對象中則被稱之為方法。 簡述 現在大伙都在講面向對象編程,但是我們也得先找著一個對象是不?不然怎么面向對象?怎么編程? --- 笑話一則,但是理不虧,要搞P面向對象編程,我們起碼要先搞懂對象(還有類)是什么?只有了解它,理解它,你才能駕馭它。...
摘要:本文中,作者通過多個方面深入剖析抽象類和接口的區別,并結合經驗供讀者借鑒學習,本文系工程師編譯整理。在開發人員崗位面試時,是否了解抽象類和接口之間的基本區別是一個很重要的考量因素。 【編者按】本文作者是Sebastian Malaca,是面向對象編程的狂熱者,不斷深化研究整潔代碼和高代碼質量。本文中,作者通過多個方面深入剖析抽象類和接口的區別,并結合經驗供讀者借鑒學習,本文系 OneA...
閱讀 1367·2021-09-02 10:19
閱讀 1108·2019-08-26 13:25
閱讀 2118·2019-08-26 11:37
閱讀 2422·2019-08-26 10:18
閱讀 2684·2019-08-23 16:43
閱讀 3012·2019-08-23 16:25
閱讀 785·2019-08-23 15:53
閱讀 3306·2019-08-23 15:11