[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

作者: Anytao  來源: 博客園  發布時間: 2008-09-11 15:37  閱讀: 9414 次  推薦: 3   原文鏈接   [收藏]  
 

系列文章導航:

[你必須知道的.NET] 開篇有益

[你必須知道的.NET] 第一回:恩怨情仇:is和as

[你必須知道的.NET] 第二回:對抽象編程:接口和抽象類

[你必須知道的.NET] 第三回:歷史糾葛:特性和屬性

[你必須知道的.NET] 第四回:后來居上:class和struct

[你必須知道的.NET] 第五回:深入淺出關鍵字---把new說透

[你必須知道的.NET] 第六回:深入淺出關鍵字---base和this

[你必須知道的.NET] 第七回:品味類型---從通用類型系統開始

[你必須知道的.NET] 第八回:品味類型---值類型與引用類型(上)-內存有理

[你必須知道的.NET] 第九回:品味類型---值類型與引用類型(中)-規則無邊

[你必須知道的.NET] 第十回:品味類型---值類型與引用類型(下)-應用征途

[你必須知道的.NET] 第十一回:參數之惑---傳遞的藝術(上)

[你必須知道的.NET] 第十二回:參數之惑---傳遞的藝術(下)

[你必須知道的.NET] 第十三回:從Hello, world開始認識IL

[你必須知道的.NET] 第十四回:認識IL代碼---從開始到現在

[你必須知道的.NET] 第十五回:繼承本質論

[你必須知道的.NET] 第十六回:深入淺出關鍵字---using全接觸

[你必須知道的.NET] 第十七回:貌合神離:覆寫和重載

[你必須知道的.NET] 第十八回:對象創建始末(上)

[你必須知道的.NET] 第十九回:對象創建始末(下)

[你必須知道的.NET]第二十回:學習方法論

[你必須知道的.NET]第二十一回:認識全面的null

[你必須知道的.NET]第二十二回:字符串駐留(上)---帶著問題思考

[你必須知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二

 

  本文將介紹以下內容:

  • 面向對象思想:多態

  • 接口

  • 抽象類

  1. 引言

  在我之前的一篇post《抽象類和接口的誰是誰非》中,和同事管偉的討論,得到很多朋友的關注,因為是不成體系的論道,所以給大家了解造成不便,同時關于這個主題的系統性理論,我認為也有必要做以總結,因此才有了本篇的新鮮出爐。同時,我將把上貼中的問題順便也在此做以交代。

  2. 概念引入

  • 什么是接口?

  接口是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數和返回值。接口方法不能包含任何實現,CLR允許接口可以包含事件、屬性、索引器、靜態方法、靜態字段、靜態構造函數以及常數。但是注意:C#中不能包含任何靜態成員。一個類可以實現多個接口,當一個類繼承某個接口時,它不僅要實現該接口定義的所有方法,還要實現該接口從其他接口中繼承的所有方法。

  定義方法為:

Code

  • 什么是抽象類?

  抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能實例化,必須通過繼承由派生類實現其抽象方法,因此對抽象類不能使用new關鍵字,也不能被密封。如果派生類沒有實現所有的抽象方法,則該派生類也必須聲明為抽象類。另外,實現抽象方法由overriding方法來實現。

  定義方法為:

Code

 

  3. 相同點和不同點

    3.1 相同點

    • 都不能被直接實例化,都可以通過繼承實現其抽象方法。

    • 都是面向抽象編程的技術基礎,實現了諸多的設計模式。

    3.2 不同點

    • 接口支持多繼承;抽象類不能實現多繼承。

    • 接口只能定義抽象規則;抽象類既可以定義規則,還可能提供已實現的成員。

    • 接口是一組行為規范;抽象類是一個不完全的類,著重族的概念。

    • 接口可以用于支持回調;抽象類不能實現回調,因為繼承不支持。

    • 接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法;抽象類可以定義字段、屬性、包含有實現的方法。  

    • 接口可以作用于值類型和引用類型;抽象類只能作用于引用類型。例如,Struct就可以繼承接口,而不能繼承類。

    3.3 規則與場合

     • 請記住,面向對象思想的一個最重要的原則就是:面向接口編程。

    • 借助接口和抽象類,23個設計模式中的很多思想被巧妙的實現了,我認為其精髓簡單說來就是:面向抽象編程。

    • 抽象類應主要用于關系密切的對象,而接口最適合為不相關的類提供通用功能。

    • 接口著重于CAN-DO關系類型,而抽象類則偏重于IS-A式的關系;

    • 接口多定義對象的行為;抽象類多定義對象的屬性;

    • 接口定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的接口都定義為public,原因就不必多說了。

    • “接口不變”,是應該考慮的重要因素。所以,在由接口增加擴展時,應該增加新的接口,而不能更改現有接口。

    • 盡量將接口設計成功能單一的功能塊,以.NET Framework為例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一個公共方法。

    • 接口名稱前面的大寫字母“I”是一個約定,正如字段名以下劃線開頭一樣,請堅持這些原則。

    • 在接口中,所有的方法都默認為public。

    • 如果預計會出現版本問題,可以創建“抽象類”。例如,創建了狗(Dog)、雞(Chicken)和鴨(Duck),那么應該考慮抽象出動物(Animal)來應對以后可能出現風馬牛的事情。而向接口中添加新成員則會強制要求修改所有派生類,并重新編譯,所以版本式的問題最好以抽象類來實現。

    • 從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實實現。

    • 對抽象類不能使用new關鍵字,也不能被密封,原因是抽象類不能被實例化。

    • 在抽象方法聲明中不能使用 static 或 virtual 修飾符。 

    以上的規則,我就厚顏無恥的暫定為T14條吧,寫的這么累,就當一時的獎賞吧。大家也可以互通有無,我將及時修訂。

3
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()