C#入門分享(六)——封裝、繼承與多態

     C#是純面向對象的編程語言,運用面向對象的思想對於編寫一個大型工程就顯得很是重要。和其餘的面嚮對象語言同樣,C#也主要是經過封裝(encapsulating)、繼承(inheritance)和多態(polymorphism)來實現。程序員

     (一)封裝正則表達式

      客戶但願在不使用方法的狀況下訪問對象的狀態,可是類的設計者卻想將類的狀態隱藏在類成員中而讓客戶只能經過方法間接訪問對象的狀態。屬性知足了這兩個目的: 經過屬性(properties)來封裝數據,爲客戶提供簡單的「相似成員變量」的接口;同時爲設計者提供了「使用方法來實現」的OO設計所必須的數據隱藏性。編程

      經過上一篇博客所講的get與set控制器咱們能夠定義一些存儲屬性的私有成員,例如:編程語言

 

     能夠在get和set前加一些修飾符,如:protected,internal,private,但使用修飾符時,必須get和set訪問方法都存在,且只能修飾其中之一。而且修飾符的訪問級別要低於屬性或索引器的訪問級別。internal關鍵字是類型和類型成員的訪問修飾符。只有在同一個程序集的文件中,內部類型或者是成員才能夠訪問。函數

     有時須要使用靜態構造方法初始化,但又不但願數值被改變的時候使用關鍵字readonly。學習


     (二)繼承設計

      在面向對象的編程中,有兩種大相徑庭的繼承類型:實現繼承和接口繼承。3d

           實現繼承:表示一個類型派生於一個基類型,它擁有該基類型的全部成員字段和函數。在實現繼承,派生類型採用基類型的每一個函數的實現代碼,除非在派生類型的定義中指                          定重寫某個函數的實現代碼。在須要給現有的類型添加功能,或許多相關的類型共享一組重要的公共功能時,這種類型的繼承很是有用。指針

           接口繼承:表示一個類型只繼承了函數的簽名,沒有繼承任何實現代碼 。在須要指定該類型具備某些可用的特性時,最好使用這種類型的繼承。

      一些語言(如C++)支持所謂的 「多重繼承」,即 一個類派生自多個類。C#不支持多重實現繼承。而C#又容許類型派生自多個接口:多重接口繼承。這說明,C#能夠派生自另外一個類和任意多個接口。更準確地說,由於 System.Object是一個公共的基類,因此每一個C#類(除了Object類以外)都有一個基類,還能夠有任意多個基接口。對象

      實現繼承:      

            若是要聲明派生自另外一個類的一個類,就可使用下面的語法(基類放冒號後面):

         這個語法很是相似於C++ 和 Java 中的語法,可是,C++程序員習慣於使用公共和私有繼承的概念,要注意不支持私有繼承,所以在基類名上沒有public 或 private限定符。支持私有繼承只會大大增長語言的複雜性。

         若是類(或結構)也派生自接口,則用逗號分隔列表中的基類和接口:



         把一個基類函數聲明爲virtual,就能夠在任何派生類中重寫該函數:


        抽象類和抽象函數:

              C#容許把類和函數聲明爲abstract。抽象類不能實例化,而抽象函數不能直接實現,必須在非抽象的派生類中重寫。顯然,抽象函數自己也是虛擬的(儘管也不須要提供            virtual關鍵字,實際上,若是提供了該關鍵字,就會產生一個語法。若是類包含抽象函數,則該類也是抽象的,也必須聲名爲抽象的:

(三)多態

       繼承有兩各方面的做用最爲強大,一方面可讓代碼有很強的重用性,另外一方面就是多態。

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

       理解多態以前首先要對面向對象的里氏替換原則和開放封閉原則有所瞭解。

             里氏替換原則(Liskov Substitution Principle):

                  派生類(子類)對象可以替換其基類(超類)對象被使用。通俗一點的理解就是「子類是父類」,當須要一個父類類型的對象的時候能夠給一個子類類型的對象;當                   須要一個子類類型對象的時候給一個父類類型對象是不能夠的!

             開放封閉原則(Open Closed Principle):

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

        咱們先來看下怎樣用虛方法實現多態:

              建立基類Bird以下,添加一個虛方法Eat():


               建立子類Magpie以下,繼承父類Bird,重寫父類Bird中的虛方法Eat():


                建立一個子類Eagle以下,繼承父類Bird,重寫父類Bird中的虛方法Eat():


               到此,一個基類,兩個個子類已經建立完畢,接下來咱們在主函數中來看下多態是怎樣體現的:


         這樣就會顯示各種相應的內容了。

         除了經過虛方法實現多態,還有另外兩種方法,即利用抽象或者接口來實現多態,在這裏就先不介紹了,你們能夠查閱相關資料學習這兩種實現多態的方法。

         關於C#面向對象編程咱們就先介紹到這,下一篇博客爲你們介紹C#的字符串與正則表達式。

相關文章
相關標籤/搜索