摘要:在設(shè)計(jì)模式中,抽象類不能夠被實(shí)例化初始化,但是可以依靠具體類的繼承來(lái)實(shí)現(xiàn)。對(duì)于大型項(xiàng)目來(lái)說(shuō),對(duì)象都是由基本的抽象類繼承實(shí)現(xiàn),而這些類的方法通常都由接口來(lái)定義。
Introduction原文地址:PHP設(shè)計(jì)模式(二):抽象類和接口
對(duì)于編程來(lái)說(shuō),對(duì)事物的抽象是一個(gè)老生常談的話題,抽象問(wèn)題更利于面向?qū)ο缶幊桃约俺绦蛟O(shè)計(jì)模式。
和C/C++,Java,Python等語(yǔ)言一樣,PHP也支持面向?qū)ο?,但是又有略微區(qū)別,如PHP支持在接口中定義常量,但是不支持抽象變量。
對(duì)事物的抽象是指,區(qū)別兩個(gè)不同事物之間的本質(zhì)特征,這兩個(gè)事物應(yīng)該在某個(gè)視角上有明確的區(qū)分界限。
如,鯨魚和鯉魚,這兩個(gè)事物在動(dòng)物的視角上,有明確的區(qū)分界限,屬于不同的動(dòng)物;但是在水生動(dòng)物的視角上,他們屬于同一種動(dòng)物的抽象。
合理的對(duì)問(wèn)題進(jìn)行抽象,構(gòu)造模型,將更容易通過(guò)編程來(lái)解決問(wèn)題。
記?。撼橄笫蔷幊探鉀Q問(wèn)題的基礎(chǔ),越復(fù)雜的問(wèn)題,越需要一開始就對(duì)問(wèn)題進(jìn)行抽象,而不是直接寫代碼。
抽象類是一個(gè)編程概念,PHP中叫Abstract Classes。在設(shè)計(jì)模式中,抽象類不能夠被實(shí)例化/初始化,但是可以依靠具體類的繼承來(lái)實(shí)現(xiàn)。
有點(diǎn)抽象,對(duì)吧?用代碼來(lái)解釋:
定義了動(dòng)物這個(gè)抽象類,動(dòng)物的屬性是名字name,然后有一個(gè)方法是吃食物eat food。
為什么動(dòng)物是抽象類?因?yàn)閯?dòng)物這個(gè)物種并不是一個(gè)存在于自然界的東西,它是人類腦海里抽象出的東西。存在自然界的是鯨魚和鯉魚這樣的確定性動(dòng)物。
比如鯨魚的概念,應(yīng)該是屬于動(dòng)物,繼承Animal類,我們定義鯨魚這個(gè)類以及吃東西的方法:
name = "Whale"; } public function eat($food) { echo $this->name . " eat " . $food . ". "; } } ?>
現(xiàn)在我們可以初始鯨魚類,并且調(diào)用吃的方法了:
eat("fish"); ?>
運(yùn)行一下:
$ php Whale.php Whale eat fish.接口/Interface
PHP也支持面向過(guò)程編程概念中的接口,下面同樣用鯨魚的例子來(lái)講述:
同樣定義一個(gè)鯨魚類,來(lái)實(shí)現(xiàn)上述接口:
現(xiàn)在我們可以初始鯨魚類,并且調(diào)用吃的方法了:
eat("fish"); ?>
運(yùn)行一下:
$ php Whale.php Whale eat fish.抽象類vs接口
上面的抽象類和接口的例子,看上去是不是類似?事實(shí)上,對(duì)于PHP編程來(lái)說(shuō),抽象類可以實(shí)現(xiàn)的功能,接口也可以實(shí)現(xiàn)。
抽象類的接口的區(qū)別,不在于編程實(shí)現(xiàn),而在于程序設(shè)計(jì)模式的不同。
一般來(lái)講,抽象用于不同的事物,而接口用于事物的行為。
如:水生生物是鯨魚的抽象概念,但是水生生物并不是鯨魚的行為,吃東西才是鯨魚的行為。
對(duì)于大型項(xiàng)目來(lái)說(shuō),對(duì)象都是由基本的抽象類繼承實(shí)現(xiàn),而這些類的方法通常都由接口來(lái)定義。
此外,對(duì)于事物屬性的更改,建議使用接口,而不是直接賦值或者別的方式,如:
observeEat($whale); $this->observeEat($carp); } function observeEat(IAction $animal) { $animal->eat(); } } $observer = new observer(); ?>
運(yùn)行一下:
$ php Observer.php Whale eat fish. Carp eat moss.Summary
好的設(shè)計(jì)模式是嚴(yán)格對(duì)問(wèn)題進(jìn)行抽象,雖然抽象類和接口對(duì)于編程實(shí)現(xiàn)來(lái)說(shuō)是類似的,但是對(duì)于程序設(shè)計(jì)模式是不同的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21474.html
摘要:關(guān)于抽象類和接口的初步理解什么是抽象類抽象類是指在前加了關(guān)鍵字且存在抽象方法在類方法關(guān)鍵字前加了關(guān)鍵字的類。抽象類不能被直接實(shí)例化。抽象類中只定義或部分實(shí)現(xiàn)子類需要的方法。抽象類提供了具體實(shí)現(xiàn)的標(biāo)準(zhǔn),而接口則是純粹的模板。 關(guān)于抽象類和接口的初步理解 什么是抽象類 抽象類是指在 class 前加了 abstract 關(guān)鍵字且存在抽象方法(在類方法 function 關(guān)鍵字前加了 ab...
摘要:原文地址設(shè)計(jì)模式六世紀(jì)年代,計(jì)算機(jī)發(fā)展迅速,編程技術(shù)也日益分化。到了年代,的出現(xiàn)更是讓這種程序設(shè)計(jì)模式得以延續(xù)。根據(jù)設(shè)計(jì)模式三封裝中介紹的設(shè)計(jì)原則,在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類和類之間的訪問(wèn)交互和更新應(yīng)該是通過(guò)和。 原文地址:PHP設(shè)計(jì)模式(六):MVC Introduction 20世紀(jì)80年代,計(jì)算機(jī)發(fā)展迅速,編程技術(shù)也日益分化。桌面應(yīng)用編程,也逐漸出現(xiàn)了用戶圖形界面和程序邏輯分離的程...
摘要:面試專欄正式起更,每周一三五更新,提供最好最優(yōu)質(zhì)的面試內(nèi)容。繼上一篇面試??純?nèi)容之面向?qū)ο蟀l(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?。面向?qū)ο蟮闹饕卣鳛榉庋b繼承多態(tài)。為了提高內(nèi)聚性減少引起變化,單一原則是低耦合高內(nèi)聚的面向原則上的引申。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。繼上一篇PHP面試??純?nèi)容之面向?qū)ο螅?)發(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?...
摘要:原文地址設(shè)計(jì)模式四繼承在設(shè)計(jì)模式二抽象類和接口以及設(shè)計(jì)模式三封裝中,我們已經(jīng)見過(guò)繼承,也就是關(guān)鍵字。對(duì)于一個(gè)好的程序設(shè)計(jì),需要類和類之間應(yīng)該是低耦合的。繼承通常是繼承自抽象類,而不是具體類。 原文地址:PHP設(shè)計(jì)模式(四):繼承 Introduction 在PHP設(shè)計(jì)模式(二):抽象類和接口以及PHP設(shè)計(jì)模式(三):封裝中,我們已經(jīng)見過(guò)繼承,也就是extends關(guān)鍵字。和C/C++,J...
摘要:例如汽車這個(gè)名詞可以理解為汽車的總類,但這輛寶馬汽車則是一個(gè)具體的汽車對(duì)象。當(dāng)在類成員方法內(nèi)部調(diào)用的時(shí)候,可以使用偽變量調(diào)用當(dāng)前對(duì)象的屬性。在面向?qū)ο笾袆t被稱之為方法。 簡(jiǎn)述 現(xiàn)在大伙都在講面向?qū)ο缶幊?,但是我們也得先找著一個(gè)對(duì)象是不?不然怎么面向?qū)ο??怎么編程?--- 笑話一則,但是理不虧,要搞P面向?qū)ο缶幊?,我們起碼要先搞懂對(duì)象(還有類)是什么?只有了解它,理解它,你才能駕馭它。...
閱讀 3490·2021-11-19 09:40
閱讀 1506·2021-10-13 09:41
閱讀 2683·2021-09-29 09:35
閱讀 2728·2021-09-23 11:21
閱讀 1722·2021-09-09 11:56
閱讀 846·2019-08-30 15:53
閱讀 854·2019-08-30 15:52
閱讀 609·2019-08-30 12:47