接口和抽象類的異同點

GPS平臺、網站建設、軟件開發、系統運維,找森大網絡科技!
http://cnsendnet.taobao.com
來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=513php

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

什麼是抽象類?
抽象類提供多個派生類共享基類的公共定義,它既能夠提供抽象方法,也能夠提供非抽象方法。抽象類不能實例化,必須經過繼承由派生類實現其抽象方法,所以對抽象類不能使用new關鍵字,也不能被密封。若是派生類沒有實現全部的抽象方法,則該派生類也必須聲明爲抽象類。另外,實現抽象方法由override方法來實現。編程

相同點 設計模式

都不能被直接實例化,均可以經過繼承實現其抽象方法。
都是面向抽象編程的技術基礎,實現了諸多的設計模式。 安全

不一樣點 網絡

接口支持多繼承;抽象類不能實現多繼承。
接口只能定義抽象規則;抽象類既能夠定義規則,還可能提供已實現的成員。
接口是一組行爲規範;抽象類是一個不徹底的類,着重族的概念。
接口能夠用於支持回調;抽象類不能實現回調,由於繼承不支持。
接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實現的方法;抽象類能夠定義字段、屬性、包含有實現的方法。
接口能夠做用於值類型和引用類型;抽象類只能做用於引用類型。例如,Struct就能夠繼承接口,而不能繼承類。 運維

MSDN的建議是: ide

若是預計要建立組件的多個版本,則建立抽象類。抽象類提供簡單易行的方法來控制組件版本。經過更新基類,全部繼承類都隨更改自動更新。另外一方面,接口一旦建立就不能
更改。若是須要接口的新版本,必須建立一個全新的接口。
若是建立的功能將在大範圍的全異對象間使用,則使用接口。抽象類應主要用於關係密切的對象,而接口最適合爲不相關的類提供通用功能。
若是要設計小而簡練的功能塊,則使用接口。若是要設計大的功能單元,則使用抽象類。
若是要在組件的全部實現間提供通用的已實現功能,則使用抽象類。抽象類容許部分實現類,而接口不包含任何成員的實現。 函數

  1. 結論

接口和抽象類,是論壇上、課堂間討論最多的話題之一,之因此將這個老話題拿出來再議,是由於從個人體會來講,深入的理解這兩個面向對象的基本內容,對於盤活面向對象
的抽象化編程思想相當重要。本文基本概況了接口和抽象類的概念、異同和使用規則,從學習的觀點來看,我認爲這些總結已經足以表達其核心。可是,對於面向對象和軟件設
計的深刻理解,仍是創建在不斷實踐的基礎上,Scott說本身天天堅持一個小時用來寫Demo,那麼咱們是否是更應該勤於鍵盤呢。對於接口和抽象類,請多用而知其然,多想而
知其奧吧。
什麼是抽象方法,什麼是虛方法
若是一個基類方法要在派生類中被覆蓋,就必須把這個基類方法申明爲virtual
抽象方法和虛擬方法的區別在於:
虛擬方法有一個實現部分,併爲派生類提供了覆蓋該方法的選項;相反,
抽象方法沒有提供實現部分,強制派生類覆蓋方法(不然派生類不能成爲具體類) 學習

總結:

  1. 若是一個類所有由抽象方法組成,那就是接口。即接口中的方法都是抽象方法。
  2. 抽象類中的方法能夠是抽象方法,也能夠是非抽象方法(即普通方法)。
    //在抽象類和接口中,抽象方法和接口方法都不能有方法體,須要依靠繼承基類的子類去實現
    //抽象方法必定沒有方法體,而虛方法有方法體
    //能夠把抽象方法看做是沒有方法體的虛方法
    1。在c語言中,函數是採用早期綁定的,即在程序運行以前,編譯器就要決定調用那個函數,這個過程叫作靜態聯編。
    2。動態聯編,這項功能在c++中默認是關閉的。開啓某個函數的晚期綁定的方式是在此函數的類型前加入virtual關鍵字,這種採用晚期綁定的函數就稱爲虛函數。
    引自msdn:
    若一個實例方法的聲明中含有 virtual 修飾符,則稱該方法爲虛擬方法;一個虛擬方法的實現能夠由派生類取代。取代所繼承的虛擬方法的實現的過程稱爲重寫該方法;在一個虛擬方法調用中,該調用所涉及的那個實例的運行時類型肯定了要被調用的到底是該方法的哪個實現。

    虛函數的限制:

    1.虛函數僅適用於有繼承關係的類對象, 因此只有類的成員函數才能說明爲虛函數.
    2.靜態成員函數不能是虛函數.
    3.內聯函數不能是虛函數.
    4.構造函數不能是虛函數.
    5.析構函數能夠是虛函數.

    接口能夠有靜態成員、嵌套類型、抽象、虛擬成員、屬性和事件。實現接口的任何類都必須提供接口中所聲明的抽象成員的定義。接口能夠要求任何實現類必須實現一個或多個其餘接口。

    對接口有如下限制:

    接口能夠用任何可訪問性來聲明,但接口成員必須全都具備公共可訪問性。
    不能向成員或接口自身附加安全性權限。
    接口能夠定義類構造函數,但不能定義實例構造函數。
    每種語言都必須爲須要成員的接口映射一個實現提供規則,由於不僅一個接口能夠用相同的簽名聲明成員,且這些成員能夠有單獨的實現。

    接口能夠由類和結構來實現。爲了指示類或結構實現了某接口,在該類或結構的基類列表中應該包含該接口的標識符。若是一個類或結構實現某接口,則它還隱式實現該接口的全部基接口。即便在類或結構的基類列表中沒有顯式列出全部基接口,也是這樣。

GPS平臺、網站建設、軟件開發、系統運維,找森大網絡科技!
http://cnsendnet.taobao.com
來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=513

相關文章
相關標籤/搜索