C#進階編程 chapter 4 繼承 讀書筆記

來源:互聯網
上載者:User

C#進階編程 chapter 4 繼承 讀書筆記

1》 實現繼承和介面繼承
  A》 實現繼承 表示一個類型派生於一個基底類型,擁有該基底類型的所有成員欄位和函數;
  B》 介面繼承 表示一個類型只繼承了函數的簽名,沒有繼承任何實現代碼。
  C》 個人理解:實現繼承就是一個子類繼承了一個父類,而父類非介面,有關於各個函數的具體實現,子類可以擴充自己的功能,但是從

父類繼承來的函數必須重寫之以賦予其新的特性;介面繼承,就是一個類實現了一個介面,只是被要求必須實現某些特性,但是沒有被強制

指定具體的實現細節,這樣有共性的不同類型可以通過介面繼承來保持共性,並且實現個性。同時,我覺得介面繼承在一定程度上提供了一

種類型劃分的層次:介面屬於類型的上層,而不同的子類處在下層,可以用一組上層類型來將不同的子類組織在一起。比如在實現LogRecord

的時候,有Redo,Undo等不同類型的LogRecord,但是都繼承自LogRecord介面,用一個LogRecord數組,可以將不同的日誌記錄組織在一起。
2》 多重繼承
  A》 C#的多重繼承之允許類型派生於多個介面。這說明,C#類可以派生於另一個類和多個介面。因為System.Object是一個公用積累,所以

每個C#類(Object除外)都有一個積累,還可以有任意多個介面。
3》 結構和類
  A》 使用結構的一個限制是結構不支援繼承,但是每個機構都自動派生於System.ValueType。不能建立結構的類型層次,但是結構可以實

現介面。換言之,結構不支援實現繼承,但是支援介面繼承。
  B》·1 結構總是派生於System.ValueType,它們還可以派生於任意多個介面;
       ·2 類總是派生於使用者選擇的另一個類,它們還可以派生於任意多個介面。
4》 實現繼承
  A》 class MyDerivedClass : MyBaseClass {}
  B》 public class MyDerivedClass : MyBaseClass,IInterface1,IInterface2 {}
  C》 public struct MyDerivedStruct : IInterface1,IInterface2 {}
5》 虛方法
  把一個基類函式宣告為virtual,該函數就可以在任何衍生類別中重寫了;
  在衍生類別中,重寫虛方法的時候,要使用override關鍵字顯式聲明。
6》 隱藏方法
  接5》中的方法重寫,如果原方法和重寫的方法沒有聲明virtual和override的時候,就產生了隱藏方法,衍生類別中的方法將原方法隱藏,

這是不安全的,編譯會有warning,要實現隱藏方法應該的做法是:使用new關鍵字,即 public new int MyOldMethod(){};
7》 調用方法的基類版本
  C#中沒有super關鍵字,用的是base,但用法一樣:base.MyOldMethod()。
  注意:可以使用base.<MethodName>()文法調用基類中的任何方法,不必再同一個方法的重載中調用它。
8》 抽象類別和抽象函數
  C#允許吧類和函式宣告為abstract,抽象類別不能執行個體化,而抽象函數沒有執行代碼,必須在非抽象的衍生類別中重寫(顯然,抽象函數也是

虛擬)
9》 密封類和密封方法
  c#允許把類和方法聲明為sealed。對於類來書,這表示不能被繼承;對於方法來說,這表示不能被重寫。
  可以把C#中的sealed當做Java中的final。(但是sealed對成員變數無效,這樣的修飾認為是非法的,而final可以對成員變數修飾)
10》 衍生類別的建構函式
  預設的建構函式在整個階層中的使用:編譯器首先找到類A試圖執行個體化的建構函式,這個建構函式首先要做的是為其直接基類(類B)

運行建構函式,然後類B的建構函式運行其直接基類(類C)的建構函式……直到System.Object,System.Object沒有任何基類,所以它的構

造函數直接運行,然後依次返回,最終類A的執行個體就已經成功地構造和初始化了。
11》 修飾符
  A》 可見度修飾符
  ----------------------------------------------------------------------------------------------------------
          修飾符            |          應用於                      |                  說明
  ----------------------------------------------------------------------------------------------------------
   public                   |  所有的類型或成員                | 任何代碼均可以訪問該方法
  ----------------------------------------------------------------------------------------------------------
   protected              |  類型和內嵌類型的所有成員     | 只有派生的類型能訪問該方法
  ----------------------------------------------------------------------------------------------------------
   internal                 |  類型和內嵌類型的所有成員     | 只能在包含它的程式集中訪問該方法
  ----------------------------------------------------------------------------------------------------------
   private                  |  所有的類型或成員                | 只能在它所屬的類型中訪問該方法
  ----------------------------------------------------------------------------------------------------------
   protected internal   |  類型和內嵌類型的所有成員    | 只能在包含它的程式集和衍生類別型的代碼中訪問該方法
  ----------------------------------------------------------------------------------------------------------
  不能把類型定義為protected、private和protected internal,因為這些修飾符對於包含在命名空間中的類型來說是沒有意義的。因此,

這些修飾符只能應用於成員。但是,可以利用這些修飾符定義潛逃的類型(即包含在其他類型中的類型),因為在這種情況下,類型也具有

成員的狀態。
  B》 其他修飾符
  ----------------------------------------------------------------------------------------------------------
          修飾符        |          應用於                |                  說明
  ----------------------------------------------------------------------------------------------------------
   new                  | 函數成員                      | 成員用相同的簽名隱藏繼承的成員
  ----------------------------------------------------------------------------------------------------------  
   static                | 所有成員                      | 成員不在類的具體執行個體上執行
  ----------------------------------------------------------------------------------------------------------
   virtual               | 僅類和函數成員              | 成員可以由衍生類別重寫
  ----------------------------------------------------------------------------------------------------------
   abstract            | 僅函數成員                   | 虛擬成員定義了成員的簽名,但沒有提供實現代碼
  ----------------------------------------------------------------------------------------------------------
   override            | 僅函數成員                   | 成員重寫了繼承的虛擬或抽象成員
  ----------------------------------------------------------------------------------------------------------
   sealed               | 類                              | 成員重寫了繼承虛擬成員,但繼承該類的任何類都不能重
                           |                                  | 寫該成員。該修飾符必須與override一起使用
  ----------------------------------------------------------------------------------------------------------
   extern               | 僅靜態[DllImport]方法   | 成員在外部用另一種語言實現
  ----------------------------------------------------------------------------------------------------------
  internal與public類似,但訪問僅限於同一個程式集中的其他代碼,換言之,在同一個程式中編譯的代碼。internal能保證同一程式中編

寫的其他類都能訪問某一成員,但是程式之外的其他代碼不能訪問。
  protected internal合并和protected和internal,但這是一種OR合并,而不是AND合并。protected internal成員在同一個程式集的任何

代碼中都可見,在衍生類別中也可見,甚至在其他程式集中也可見。

12》 介面
  A》 介面特性
   1· 聲明介面在文法上與聲明抽象類別完全相同,但不允許提供介面中任何成員的執行方式。一般情況下,介面中只能包含方法、屬

性、索引器和事件的聲明;
   2· 不能執行個體化介面,它只能包含其成員的簽名。介面不能有建構函式或欄位;
  3· 介面定義也不允許包含有運算子多載,只是因為介面通常是公用契約,包含運算子多載還引起一些與其他.NET語言的不相容的

問題;
   4· 介面定義中海不允許聲明成員上的修飾符;
   5· 介面成員是公用的,不能聲明為虛擬或靜態。
  B》 介面引用完全可以看做是類引用--但介面引用的強大之處在於,它可以引用任何實現該介面的類。(如最開始所說,可以用介面來組

織所有實現該介面的那些類)。
  C》 派生的借口
    介面可以彼此繼承,其方式與類的繼承相似。

-------------------------------------------------------------------------------------------------------------------------
   第一次認真地把這些東西看一遍,總結一下,雖然簡單、瑣屑,但是很基礎。
   學習C#其實是用的代碼催動的做法,草草看了基本的文法,然後就直接上了幾千行的代碼,做源碼分析,雖然收穫不少,但是有點囫圇吞

棗的感覺,基礎不紮實,乘著這次寫代碼的機會,好好把C#學習一遍。
   明顯感覺很多東西之前都漏掉了,唉,杯具下……
   加油,每天進步一點點!
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.