六.繼承與多態(tài)
1. 類(lèi)的組合和繼承(繼承===“是炊汹、像”躬充、“父與子”,組合===“需要”讨便、“整體與局部”)
組合:在類(lèi)中創(chuàng)建對(duì)象進(jìn)行使用
繼承:類(lèi)與類(lèi)之間的父子關(guān)系充甚,子類(lèi)繼承父類(lèi)的方法和屬性
- 在子類(lèi)中,parent關(guān)鍵字代表父類(lèi)霸褒,self代表自身伴找,用::運(yùn)算符,又叫范圍解析操作符废菱,調(diào)用父類(lèi)的方法
- 繼承的缺陷:
~ 繼承破壞封裝性
~ 繼承是緊耦合的
~ 繼承擴(kuò)展復(fù)雜
~ 不恰當(dāng)?shù)氖褂美^承可能違反現(xiàn)實(shí)世界的邏輯(角色與權(quán)限問(wèn)題) - 繼承的使用
~ 被繼承的類(lèi)要設(shè)計(jì)好技矮,繼承樹(shù)不要超過(guò)三層
~ 使用final修飾符對(duì)不能被繼承的類(lèi)進(jìn)行修飾。使用final修飾符不僅可防止重要的方法被非法覆寫(xiě)殊轴,又能給編輯器尋找優(yōu)化的機(jī)會(huì)
~ 優(yōu)先考慮使用組合關(guān)系來(lái)提高代碼的可重用性
~ 子類(lèi)是一種特殊的類(lèi)型衰倦,而不只是父類(lèi)的一個(gè)角色
~ 子類(lèi)擴(kuò)展,而不是覆蓋或者使父類(lèi)的功能失效
~ 底層代碼多用組合梳凛,頂層/業(yè)務(wù)層代碼多用繼承耿币。底層用組合可以提高效率,避免對(duì)象臃腫韧拒。頂層代碼用繼承可以提高靈活性淹接,讓業(yè)務(wù)使用更方便十性。
traits
PHP 5.4中的traits,是新引入的特性塑悼,中文還真不知道如何準(zhǔn)確翻譯好劲适。其實(shí)際的目的,是為了有的場(chǎng)合想用多繼承厢蒜,但PHP又沒(méi)多繼承霞势,于是就發(fā)明了這樣的一個(gè)東西。
Traits可以理解為一組能被不同的類(lèi)都能調(diào)用到的方法集合斑鸦,但Traits不是類(lèi)愕贡!不能被實(shí)例化。先來(lái)例子看下語(yǔ)法:
<?php
trait myTrait{
function traitMethod1(){}
function traitMethod2(){}
}
//然后是調(diào)用這個(gè)traits,語(yǔ)法為:
class myClass{
use myTrait;
}
//這樣就可以通過(guò)use myTraits巷屿,調(diào)用Traits中的方法了固以,比如:
$obj = new myClass();
$obj-> traitMethod1 ();
$obj-> traitMethod2 ();
>
2. 各種語(yǔ)言中的多態(tài)
多態(tài)
- 多態(tài)就是同一對(duì)象在運(yùn)行時(shí)的具體化
- 多態(tài)性是一種通過(guò)多種狀態(tài)或階段描述相同對(duì)象的編程方式
- 意義在于:實(shí)際開(kāi)發(fā)中,只要關(guān)心一個(gè)接口或基類(lèi)的編程嘱巾,而不必關(guān)心一個(gè)對(duì)象所屬的具體類(lèi)
- 區(qū)別是否是多態(tài)的關(guān)鍵在于看對(duì)象是否屬于同一類(lèi)型憨琳。如果把它們看成同一類(lèi)型,調(diào)用相同的函數(shù)旬昭,返回了不同的結(jié)果篙螟,那么他就是多態(tài)。
- 多態(tài)的本質(zhì)就是if...else 问拘,只是實(shí)現(xiàn)的層級(jí)不同
- 多態(tài)的本質(zhì)就是if...else 遍略,只是實(shí)現(xiàn)的層級(jí)不同