面向對象編程感悟

多態:容許將子類類型的指針賦值給父類類型的指針。也就是同一操做做用於不一樣的對象,能夠有不一樣的解釋,產生不一樣的執行結果。在運行時,能夠經過指向基類的指針,來調用實現派生類中的方法。工具

接口是一組規則的集合,它規定了實現本接口的類或接口必須擁有的一組規則。體現了天然界「若是你是……則必須能……」的理念。

例如,在天然界中,人都能吃飯,即「若是你是人,則必須能吃飯」。那麼模擬到計算機程序中,就應該有一個IPerson(習慣上,接口名由「I」開頭)接口,並有一個方法叫Eat(),而後咱們規定,每個表示「人」的類,必須實現IPerson接口,這就模擬了天然界「若是你是人,則必須能吃飯」這條規則。
從這裏,我想各位也能看到些許面向對象思想的東西。面向對象思想的核心之一,就是模擬真實世界,把真實世界中的事物抽象成類,整個程序靠各個類的實例互相通訊、互相協做完成系統功能,這很是符合真實世界的運行情況,也是面向對象思想的精髓。

接口是在必定粒度視圖上同類事物的抽象表示。注意這裏我強調了在必定粒度視圖上,由於「同類事物」這個概念是相對的,它由於粒度視圖不一樣而不一樣。

 

象類和接口的區別在於使用動機。使用抽象類是爲了代碼的複用,而使用接口的動機是爲了實現多態性。因此,若是你在爲某個地方該使用接口仍是抽象類而猶豫不決時,那麼能夠想一想你的動機是什麼。設計

 

總而言之,接口與抽象類的區別主要在於使用的動機,而不在於其自己。而一個東西該定義成抽象類仍是接口,要根據具體環境的上下文決定。再者,我認爲接口和抽象類的另外一個區別在於,抽象類和它的子類之間應該是通常和特殊的關係,而接口僅僅是它的子類應該實現的一組規則。(固然,有時也可能存在通常與特殊的關係,但咱們使用接口的目的不在這裏)如,交通工具定義成抽象類,汽車、飛機、輪船定義成子類,是能夠接受的,由於汽車、飛機、輪船都是一種特殊的交通工具。再譬如Icomparable接口,它只是說,實現這個接口的類必需要能夠進行比較,這是一條規則。若是Car這個類實現了Icomparable,只是說,咱們的Car中有一個方法能夠對兩個Car的實例進行比較,多是比哪輛車更貴,也可能比哪輛車更大,這都無所謂,但咱們不能說「汽車是一種特殊的能夠比較」,這在文法上都不通。指針

 

里氏替換原則(Liskov Substitution Principle):派生類(子類)對象可以替換其基類(超類)對象被使用。通俗一點的理解就是「子類是父類」,舉個例子,「男人是人,人不必定是男人」,當須要一個父類類型的對象的時候能夠給一個子類類型的對象;當須要一個子類類型對象的時候給一個父類類型對象是不能夠的!對象

開放封閉原則(Open Closed Principle):封裝變化、下降耦合,軟件實體應該是可擴展,而不可修改的。也就是說,對擴展是開放的,而對修改是封閉的。所以,開放封閉原則主要體如今兩個方面:對擴展開放,意味着有新的需求或變化時,能夠對現有代碼進行擴展,以適應新的狀況。對修改封閉,意味着類一旦設計完成,就能夠獨立完成其工做,而不要對類進行任何修改。接口

相關文章
相關標籤/搜索