面向?qū)ο髲?fù)習(xí)日志一:抽象類與接口

雖然接觸面向?qū)ο笳Z言很長時間了,可是要是說對面向?qū)ο蟮乃枷胗卸嗝瓷羁痰牧私馓竿穑瑓s也未必次哈。所以開始整理知識,寫一點對面向?qū)ο蟮睦斫庑缘臇|西吆录,算是一種總結(jié)類的日志吧窑滞。畢竟對面向?qū)ο蟮闹R了解的很淺薄,難免有理解有誤的地方恢筝,如若您發(fā)現(xiàn)哀卫,請務(wù)必指出,希望我們共同進步撬槽。

抽象類

首先來介紹一下抽象類是什么此改。可以簡單的理解:被abstract修飾的方法叫做抽象方法侄柔,而一個類如果擁有抽象方法共啃,那么它就是抽象類,且也必須用abstract修飾暂题。

百度百科中這么說抽象類:

抽象類往往用來表征對問題領(lǐng)域進行分析勋磕、設(shè)計中得出的抽象概念,是對一系列看上去不同敢靡,但是本質(zhì)上相同的具體概念的抽象

可以得知抽象類是本質(zhì)相同的具體概念的抽象(簡單點挂滓,抽象類是對類的抽象),抽象是什么啸胧,就是不能實現(xiàn)的赶站,所以抽象類不能夠被實例化。不能實例化的類用來干什么纺念?答案是作為基類使用贝椿。

一個抽象類被繼承,由于抽象類的特性陷谱,我們可以得到任意個不同的實現(xiàn)方式烙博,帶來各種不同的效果瑟蜈,既嚴謹又靈活。

按照慣例我們列舉一下一個抽象類所具有的特性:

  • 如果一個類中存在一個及以上方法被聲明為抽象的渣窜,那么該類必須也是抽象的铺根;反之不正確(一個類是抽象類,那么該類中必然存在一個及以上方法為抽象方法)乔宿;
  • 抽象類不能被實例化位迂;
  • 抽象方法必須是抽象的(即不能實現(xiàn)具體內(nèi)容),并以結(jié)束符結(jié)尾详瑞;
  • 抽象類允許存在非抽象方法掂林;
  • 繼承抽象類的子類必須實現(xiàn)抽象類中的抽象方法,除非該子類也是抽象類坝橡;
  • 子類繼承泻帮,實現(xiàn)的抽象方法不能改變其參數(shù)(數(shù)量/類型);
  • 子類繼承,其實現(xiàn)的抽象方法訪問控制只能更加寬松,而不能更加嚴格蹦魔;
  • 抽象方法訪問控制條件不能為private缠局,因為被聲明為私有的方法不能被子類繼承。

由上述,你可能模模糊糊知道抽象類是用來做什么的。我再通過一個例子來說明:

某日,你老板要求團隊開發(fā)一個數(shù)據(jù)庫操作類柒竞,必須包括且不限于MySQL,SQLserver播聪,oracle等朽基。老板說話了,趕緊弄啊离陶。很快稼虎,弄好了,代碼寫的也很優(yōu)雅招刨,執(zhí)行效率也不錯霎俩,但是老板很生氣,因為沒法用啊沉眶,幾個數(shù)據(jù)庫類中方法完全不一樣打却,一個查詢方法,有定義成select的谎倔,有定義成getData的柳击,亂七八糟。

怎么解決這種問題片习。當(dāng)然可以事先溝通好捌肴,但是如果使用了抽象類就能完全的解決問題蹬叭。定義一個數(shù)據(jù)庫抽象類,在其中定義必要使用的抽象方法状知,要求各個數(shù)據(jù)庫操作類必須繼承自該抽象類秽五,OK,問題解決试幽。

如下:

abstract class db {
    # 連接方法
    protected abstract function connect();
    # 執(zhí)行查詢語句
    public abstract function query($sql);
    # 添加操作
    public abstract function insert($sql);
    # 刪除操作
    public abstract function delete($sql);
    # 更新操作
    public abstract function update($sql);
    # 查詢操作
    public abstract function select($sql);
}

接口

類是對一組具有共同特征的事物的抽象描述(對現(xiàn)實的抽象)筝蚕,而對不同類中本質(zhì)相同的概念的抽象是抽象類(類的抽象)卦碾。如果說還存在比抽象類更為抽象的铺坞,那就是說 接口 了。接口是一系列抽象方法的集合洲胖。

為什么說接口比抽象類更加抽象呢济榨。因為接口中只能存在聲明為abstract的公共方法,而不能有普通方法绿映。如下:

interface demo {
    public abstract show();
}

而擒滑,這樣是錯誤的

interface demo {
    public abstract function show();
    protected abstract function display();
    public function say() {
        echo 'Hello';
    }
}

說了不少,到底接口是啥呢叉弦?看了一篇文章丐一,上面這么說接口:

接口類說白了,就是一個類的模板淹冰,一個類的規(guī)定库车,如果你屬于這類,你就必須遵循我的規(guī)定樱拴,少一個都不行柠衍,但是具體你怎么去做,我不管晶乔,那是你的事

接口類 說的太不嚴謹了珍坊,應(yīng)該添加引號,需要知道接口并不是類正罢。不過說接口是模板比較正確阵漏。

而另一篇文章所說的我比較認同,接口是對行為的抽象翻具。什么叫行為的抽象履怯?

那先要說說行為。類是對現(xiàn)實的抽象嘛呛占,所以用現(xiàn)實來舉個例子虑乖。

人的說話是不是天生的?自然不是晾虑,如果天生會說話疹味,那一般出現(xiàn)在重生小說里面仅叫。說話需要通過后天學(xué)習(xí),如果不學(xué)習(xí)(例如新聞中被狼收養(yǎng)的孩子)就不會說話(狼孩只會狼嚎)糙捺。在這里诫咱,說話就是一種行為,是通過學(xué)習(xí)洪灯,通過思想支配表現(xiàn)出來的坎缭。可以說签钩,說(人)話就是一個接口掏呼,正常人實現(xiàn)了該接口,所以能夠說話铅檩,而狼孩實現(xiàn)的是狼嚎接口憎夷,所以他會狼嚎,而不會說話昧旨。

這個例子的結(jié)論是拾给,行為是人非天生的(不能直接繼承的),需要通過后天學(xué)習(xí)(繼承接口)的外在活動兔沃。

通過對行為的抽象蒋得,體現(xiàn)在面向?qū)ο笳Z言中,那就是接口乒疏,它是不適合在類中直接體現(xiàn)(或用來描述類)(類又可能需要)的方法的集合额衙。

理論結(jié)合實踐,反應(yīng)在實際編程中缰雇,又如何運用接口入偷?慚愧的很,我開發(fā)PHP程序可以說沒有運用到過接口械哟。而我見到的運用接口的實例都是通過多態(tài)來體現(xiàn)的疏之。

《深入PHP面向?qū)ο蟆⒛J脚c實踐》書中所舉的例子暇咆,有一個接口Chargeable锋爪,規(guī)定了抽象方法getPrice,被ShopProduct所繼承實現(xiàn)爸业,而CdProduct繼承自ShopProduct其骄。由于實現(xiàn)接口的類繼承接受了它繼承的類與所實現(xiàn)的接口的類型,所以CdProduct同時屬于CdProduct扯旷、ShopProduct拯爽、Chargeable

所以在客戶端代碼中可以定義方法cdInfo來限制僅獲取來自CdProduct的內(nèi)容:

// ……
public function cdInfo(CdProduct $item) {
    // ……
}

可以定義addProduct來限制僅允許商品進入:

// ……
public function addProduct(ShopProduct $item) {
    // cd钧忽、book等商品能夠被添加 而user不能進入
    // ……
}

當(dāng)我們只關(guān)注于計價的時候就可以定義定義addChargeable來確保傳遞的對象存在計價方法:

// ……
public function addChargeable(Chargeable $item) {
    // ……
}

好了毯炮,對抽象類與接口本次就寫到這里逼肯,等過一段時間再來做新的總結(jié),可能會有新的收獲桃煎。由于本人才疏學(xué)淺篮幢,理解或解釋不當(dāng)?shù)牡胤剑垊?wù)必指出为迈,不勝感激三椿。

參考

java提高篇(四)-----抽象類與接口
抽象類與接口的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葫辐,隨后出現(xiàn)的幾起案子搜锰,更是在濱河造成了極大的恐慌,老刑警劉巖另患,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纽乱,死亡現(xiàn)場離奇詭異蛾绎,居然都是意外死亡昆箕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門租冠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹏倘,“玉大人,你說我怎么就攤上這事顽爹∠吮茫” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵镜粤,是天一觀的道長捏题。 經(jīng)常有香客問我,道長肉渴,這世上最難降的妖魔是什么公荧? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮同规,結(jié)果婚禮上循狰,老公的妹妹穿的比我還像新娘。我一直安慰自己券勺,他們只是感情好绪钥,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著关炼,像睡著了一般程腹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上儒拂,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天寸潦,我揣著相機與錄音缀去,去河邊找鬼。 笑死甸祭,一個胖子當(dāng)著我的面吹牛缕碎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播池户,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼咏雌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了校焦?” 一聲冷哼從身側(cè)響起赊抖,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寨典,沒想到半個月后氛雪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡耸成,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年报亩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片井氢。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡弦追,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出花竞,到底是詐尸還是另有隱情劲件,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布约急,位于F島的核電站零远,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厌蔽。R本人自食惡果不足惜牵辣,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躺枕。 院中可真熱鬧服猪,春花似錦、人聲如沸拐云。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叉瘩。三九已至膳帕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背危彩。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工攒磨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汤徽。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓娩缰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谒府。 傳聞我的和親對象是個殘疾皇子拼坎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容