面試官:物件導向的三大特性和五大原則是什麼? | IT人
文章推薦指數: 80 %
物件導向的三大特性封裝,繼承,多型什麼是封裝? 把客觀的事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作, ...
Togglenavigation
IT人
IT人
面試官:物件導向的三大特性和五大原則是什麼?
boring發表於
2019-06-19
面試
物件導向
物件導向的三大特性
封裝,繼承,多型
什麼是封裝?
把客觀的事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的類進行資訊的隱藏。
簡單的說就是:封裝使物件的設計者與物件的使用者分開,使用者只要知道物件可以做什麼就可以了,不需要知道具體是怎麼實現的。
封裝可以有助於提高類和系統的安全性。
什麼是繼承?
繼承指的是建立一個新的派生類,從一個或多個先前定義的類中繼承資料和函式,可以重新定義或加進新資料和函式,從而建立了類的層次或等級。
什麼是多型?
多型性指的是:同一操作作用與不同類的例項,將產生不同的執行結果,即不同類的物件收到相同的訊息時,將得到不同的結果。
程式碼示例
classeat
{
publicfunctionbreakfast()
{
echo"吃早飯!";
}
}
classtypist
{
publicfunctiontype()
{
echo"打字!";
}
}
functionprintWorking($obj)
{
if($objinstanceofeat){
echo$obj->breakfast();
}elseif($objinstanceoftypist){
echo$obj->type();
}else{
echo"error";
}
}
printWorking(neweat());
echoPHP_EOL;
printWorking(newtypist());
輸出:
吃早飯!打字!
物件導向的五大原則
單一職責原則,開放封閉原則,里氏替換原則,依賴倒置原則,介面隔離原則
什麼是單一職責原則?
簡單的來說就是:一個類只做一件事情,不要為類實現過多的功能點,避免相同的職責分散到不同的類中。
如果一個類的職責過多可能引起變化的原因也就越多,使程式碼更加的耦合。
如果雜交不清的職責將使得程式碼難以維護,牽一髮而動全身。
例如:工廠模式,工廠模式之所以被稱為工廠模式是因為它負責“生產”物件。
程式碼示例
工廠模式的好處:多個地方new了一個物件,當此類名發生改變就不需要一個個去修改,只需要修改一處地方。
也就是說,對擴充套件開放,對修改封閉。
1.對擴充套件開放,意味著有新的需求或變化時,可以對現有的程式碼進行擴充套件,以適應新的情況。
2.對修改封閉,在對模組功能進行擴充套件時,不應該影響已有的程式模組。
實現開放封閉的原則的重點:抽象程式設計,而不是具體程式設計,因為抽象相對穩定,讓類依賴與固定的抽象類和介面,所以修改就是封閉的。
而物件導向的繼承和多型機制,又可以繼承抽象類或者實現介面,聽過重寫其方法來改變固有的行為,實現方法新的擴充,所以就是開放。
例如:裝飾器模式(Decorator),可以動態地新增修改類的功能。
一個類提供了一項功能,如果要在修改並新增額外的功能,傳統的程式設計模式,需要寫一個子類去繼承它,並重新實現類的方法,使用裝飾器模式,僅需在執行時新增一個裝飾器物件即可實現,可以實現最大的靈活性。
beforeEcho();
echo"你好,我是裝飾器。
";
//呼叫裝飾器後置操作
$this->afterEcho();
}
//增加裝飾器
publicfunctionaddDecorator(Decorator$decorator)
{
$this->decorator[]=$decorator;
}
//執行裝飾器前置操作先進先出原則
protectedfunctionbeforeEcho()
{
foreach($this->decoratoras$decorator)
$decorator->before();
}
//執行裝飾器後置操作先進後出原則
protectedfunctionafterEcho()
{
$tmp=array_reverse($this->decorator);
foreach($tmpas$decorator)
$decorator->after();
}
}
/**
*裝飾器介面
*ClassDecorator
*/
interfaceDecorator
{
publicfunctionbefore();
publicfunctionafter();
}
/**
*顏色裝飾器實現
*ClassColorDecorator
*/
classColorDecoratorimplementsDecorator
{
protected$color;
publicfunction__construct($color)
{
$this->color=$color;
}
publicfunctionbefore()
{
echo"
因此經常出現濫用繼承或者錯誤的繼承現象,給系統後期的維護帶來了不少麻煩。
核心思想:子類必須能夠替換其父類。
這一思想體現為對繼承機制的約束規範,只有子類能夠替換父類時才能保證系統在執行期內識別子類,這是保證繼承複用的基礎。
對里氏替換原則有兩種理解:
1.不能隨便去繼承不合適的,有多餘方法或者屬性的類(例子1)。
2.子類可以擴充套件父類的功能,但不能改變父類原有的功能(例子2)。
里氏替換原則包含一下幾個隱藏含義:
1.子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。
2.子類中可以增加自己特有的方法。
3.當子類的方法過載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入引數更寬鬆。
4.當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。
什麼是依賴倒置原則?
簡單的來說就是:一個類,不應該強制依賴另一個類,每個類對於另外一個類都是可替換的。
具體概念:
1.上層模組不應該依賴於下層模組,它們共同依賴於一個抽象(父類不能依賴子類,它們都要依賴抽象類)。
2.抽象不能依賴於具體,具體應該依賴於抽象。
為什麼要依賴介面?因為介面體現對問題的抽象,同時由於抽象一般是相對穩定的或者是相對變化不頻繁的,而具體是易變的。
因此,依賴抽象是實現程式碼擴充套件和執行期內繫結(多型)的基礎:只要實現了該抽象類的子類,都可以被類的使用者使用。
working();
}
}
classworkB//例子2
{
private$e;
publicfunctionset(employee$e){
$this->e=$e;
}
publicfunctionwork(){
$this->e->working();
}
}
$worka=newworkA;//workA依賴於teacher類不符合依賴倒置原則
$worka->work();
$workb=newworkB;//workB不依賴與某個類既可以注入teacher也可以注入coder
$workb->set(newteacher());
$workb->work();
在workA(例子1)中,work方法依賴於teacher實現;在workB(例子2)中,work轉而依賴抽象,這樣可以把需要的物件通過引數傳入。
上述程式碼通過介面,實現了一定程度的解耦,但仍然是有限的。
不僅是使用介面,使用工廠等也能實現一定程度的解耦和依賴倒置。
在workB中,teacher例項通過set方法傳入,從而實現了工廠模式。
由於這樣的實現仍然是硬編碼的,為了實現程式碼的進一步擴充套件,把這個依賴關係寫在配置檔案裡,指明workB需要一個teacher物件,專門由一個程式配置是否正確(如所依賴的類檔案是否存在)以及載入配置中所依賴的實現,這個檢測程式,就稱為IOC容器(這裡不清楚IOC的小夥伴可以自行谷歌)。
什麼是介面隔離原則?
其核心思想是:使用多個小的專門的介面,而不要使用一個大的總介面(只需要關心介面,不需要關心實現)。
介面隔離原則體現在:
1.介面應該是內聚的,應該避免“胖”介面。
2.不要強迫依賴不用的方法,這是一種介面汙染。
3.表明客戶端不應該被強迫實現一些不會使用的介面,應該把胖介面分組,用多個介面代替它,每個介面服務於一個子模組。
簡單地說,就是使用多個專門的介面比使用單個介面要好很多。
隔離的手段主要有以下兩種:
1、委託分離,通過增加一個新的型別來委託客戶的請求,隔離客戶和介面的直接依賴,但是會增加系統的開銷(設計模式中,如:代理模式,策略模式中都用到了委託的概念,好奇的小夥伴可以自行谷歌,這裡就不貼程式碼了)。
2、多重繼承分離,通過介面多繼承來實現客戶的需求,這種方式是較好的。
胖介面的例項說明
延伸文章資訊
- 108. 物件導向的特性—封裝、繼承、多型、抽象(撰寫中)
提到物件導向設計(Object-Oriented Programming, OOP),一定會提到它的三大特性,分別是封裝、繼承、多型。此外,還有一個東西,筆者覺得很重要,在實務經常使用,所以 ...
- 2物件導向程式設計- 維基百科,自由的百科全書
- 3OOP 物件導向的四個特性 - Corey Chen's Blog
物件導向四個特性:. 1. 抽象(Abstraction); 2. 封裝(Encapsulation); 3. 繼承(Inheritance); 4. 多型(Polymorphism).
- 4[物件導向Ep. 2] 三大特性 - CodiMD
[物件導向Ep. 2] 三大特性 · 事前功課 · 三大特性 · 封裝Encapsulation · 繼承Inheritance 具備強烈隸屬關係時適用 · 多型Polymorphism 繼承的...
- 5物件導向的三大特性和五大原則 - w3c學習教程
物件導向的三大特性是封裝多型繼承。 五大原則是單一職責原則開放封閉原則里氏替換原則依賴倒置原則介面分離原則。 物件導向.