Object與封裝、繼承和多態性編程
在面向對象編程思想中,不管是C++,Java仍是C#等,封裝、繼承與多態性都有着無與倫比的地位,深刻理解並掌握它們是必不可少的。而我將使用C#來淺談繼承與多態性。函數
1.封裝:學習
封裝就是把裏面實現的細節包起來,這樣很複雜的邏輯通過包裝以後給別人使用就很方便,別人不須要了解裏面是如何實現的,只要傳入所須要的參數就能夠獲得想要的結果。封裝很好理解,像咱們常見的函數,就是一種封裝。還有
類將一些函數一數據封裝。類是比函數更高級的一種封裝方法。
2.繼承:spa
新類(即派生類)經過繼承將獲取基類的全部非私有數據和行爲以及新類爲本身定義的全部其餘數據或行爲。所以,新類具備兩個有效類型:新類的類型和它繼承的類的類型。指針
public class A { public A() { } } public class B : A // B 直接繼承自 A { public B() { } }
從上面的代碼與圖形可與看出B直接繼承自A,那麼B就擁有了A的除了私有數據與行爲外的全部部分,但在爲B分配內存時,卻包涵了A的部分,那麼在B的內存中也包含A的私有數據和行爲的部分,那麼又爲何說B沒有這部分呢?要解決code
這個問題就要先理解類的結構:類本身的全部成員對本身都是可見(可訪問)的,但類的實例只能夠訪問它的公有(public)成員,以下:對象
public class A { private int temp; protected int temp2; public int temp3; } public class B : A { public int temp4; }
此時,B的可見成員有 temp2,temp3,temp4 ,因爲 temp 是 A 的私有成員,因此在繼承時不包含它。但在 B 的內存裏確實有一塊是用來存放A的,而在存放 A 的部分裏又有一部分存儲 temp ,因此在B的存儲空間裏也存放着 temp 這個量。blog
只不過類 B沒法直接訪問temp,若是說B繼承了A的temp,那麼B就應該能夠直接訪問temp,但實際上並不能直接訪問,因此說咱們說:在繼承時,子類確實包含了父類的全部部分,但子類本身所能訪問的只有父類的非私有部分和本身新定義繼承
的部分,即實際繼承時,只從父類繼承了其非私有部分。接口
3.多態性:
多態按字面的意思就是「多種狀態」。引用Charlie Calverts對多態的描述——多態性是容許你將父對象設置成爲和一個或更多的他的子對象相等的技術,賦值以後,父對象就能夠根據當前賦值給它的子對象的特性以不一樣的方式運做(摘自「Delphi4 編程技術內幕」)。簡單的說,就是一句話:容許將子類類型的指針(或引用)賦值給父類類型的指針(或引用)。
從上圖看出,「汽車」,「小轎車」,「馬車」等都繼承自「車」,但他們除了公有的「車」這個屬性外,都不相同。一組類,它們都繼承自同一個類,但各自擁有的新的不一樣的屬性,使得它們都不相同,呈現出多種狀態的現象,就是所謂的多態。
4.object類:
在C#(與Java)中,全部的類都直接或間接的繼承自 object 類,即 object 是全部類的基類。在咱們定義類是,若是不顯示指明基類,在編譯時,編譯器都會默認爲繼承自 object 類。爲何要這樣作呢?固然是爲了充分的體現
和利用面向對象思想的優勢--即多態性的利用。
在學習C#時你也許會忽略一個重要的知識點: 向上轉型和向下轉型
class A { pubic void A_Text() { Console.WriteLine("I'm A!"); } } class B { public void B_Text() { Console.WriteLine("I'm B!"); } } void Sample(object obj) { if(obj is A) { A a=(A)obj; //向下轉型
a.A_Text(); } else if(obj is B) { B b=(B)obj; //向下轉型
b.B_Text(); } } A a=new A(); B b=new B(); Sample(a) //向上轉型
Sample(b) //向上轉型
能夠看出,經過向上與向下轉型使得咱們在遇到相似於上面(經過另外一個函數來調用一個對象的成員)的狀況時,不須要根據參數類型寫多個重載函數,實現了代碼的簡化,可讀性更強。還有接口的實現也是經過多態來實現的,可見,使用多態的好處有不少,
只不過要真正體會其好處和掌握多態,須要大量的實踐!!!
object 類充分用到了前面講的封裝、繼承與多態,並將它們的做用發揮到了極致,學會使用 object 是咱們學習和使用C#不可或缺的部分。在這裏只是簡單提了一下 object ,若是真正的深刻講 object 類可能將是長篇大論,若是之後有時
間可能會專門研究一下 object 的成員與使用。