多維度分析:抽象類和介面的區別
【編者按】本文作者是Sebastian Malaca,是物件導向程式設計的狂熱者,不斷深化研究整潔程式碼和高程式碼質量。本文中,作者通過多個方面深入剖析抽象類和介面的區別,並結合經驗供讀者借鑑學習,本文系 OneAPM 工程師編譯整理。
在開發人員崗位面試時,是否瞭解抽象類和介面之間的基本區別是一個很重要的考量因素。
顯而易見?
完全不是。筆者面試過很多人,通常問的第一個問題是關於介面和抽象類的區別。但實際上很少有程式設計師能給出正確的答案。
就這個問題來說,初級程式設計師可能都會清楚之間的區別,可能也並不一定理解其背後的原因,但其結構上的差異,特別是針對特定語言(幾乎和所有的物件導向的語言一樣)應該深入瞭解。
同時,筆者也發現其他職位候選人(有時甚至是高階職位)竟然也不知道這之間的差異,或者只知道的一個或幾個。
如果只是需要了解這些內容那並不難,但這些都是物件導向的基礎知識,因此想要設計良好的程式碼必須對其有一個深入的認識。
下面將詳細介紹這些基礎知識。
繼承
下面將從眾所周知的介面和抽象類的區別開始。這種差異是關於繼承的,任何類都可以實現多個介面,但是隻能擴充套件一個類,也只能有一個父類。
多個類擴充套件是一個語言特性,它存在於一些物件導向的語言。為什麼呢?因為它帶來的問題往往多於價值。
當一個類有許多父類時,有一個情況就是完全相同的方法會宣告多個,因此必須顯式地「告知」究竟需要的是哪一個。
這樣的程式碼通常難以維護,因為對其進行的任何修改或者重構都必須小心地檢查。另一方面,如果一個類需要擴充套件(至少)兩個擁有相同方法的類,那麼 DRY 規則顯然會被破壞(因此需要從別處下手),或者說會干擾到 Single Responsibility Principle (SAP)。
「如果多個類的繼承如此糟糕,為什麼它可以實現許多介面呢?」——如果這樣的問題在你的腦海盤旋,我不得不承認這是一個絕妙的問題。
然而,答案很簡單。每一個介面都是基於函式而不是一個類去實現。所以,即使實現十個不同的介面,每個包含相同的方法宣告,內部也不會發生衝突。介面保證了方法的存在,而不是去說明方法的實現,這意味著,只要不違反 SRP ,你完全可以實現多個介面。
方法的可見度
介面中的所有方法都是 Public 的,但對於抽象類的宣告並沒有這樣的規則,當然不能是 Private 。為什麼不能 Private?因為一個抽象方法需要在子類中實現,但 Private 無法訪問子類,因此不抽象類不可能存在 Private 屬性。
接著迴歸主題。正如上文寫道的,介面是一個函式的保證,你可以把它當作使用介面的類和實現這個介面的類之間的一個合約——保證一個特定類將實現所有宣告的方法。這也是為什麼這些方法必須是 Public 的原因。因為被嚴格的限制到了實現上,所以其他一切都不成問題。
然而,當涉及到抽象類時並非這樣。我們總是可以有不同的類組,除了這幾方面基本上不同以外,其他地方几乎一樣,類體的公共方法也是非常相似的。在這種情況下,可以建立 Protected 方法來保持類之間的差異。Template Method 就是一個很典型的例子。
宣告和定義
介面只能包含方法宣告,而抽象類還可以包含方法的定義。
介面的重點在於提供特定函式,而抽象類還在於子類實現的相似性,不僅僅是其中的函式。
常量
介面和抽象類中都可以定義常量。這是因為這些值不依賴於特定物件,對它們來說都是相同的。
屬性
抽象類可以包含屬性,但介面卻不能。原因與宣告和定義是一樣的。
總結
除了說明差異,筆者也試圖解釋它產生的原因。這不僅是因為人們發明某個語言時的突發奇想,而是源於語言背後所支撐的理念。
原文連結:Differences Between Abstract Class and Interface
OneAPM 是應用效能管理領域的新興領軍企業,能幫助企業使用者和開發者輕鬆實現:緩慢的程式程式碼和 SQL 語句的實時抓取。想閱讀更多技術文章,請訪問 OneAPM 官方部落格。
相關文章
- 抽象類和介面的區別抽象
- Java中抽象類和介面的區別Java抽象
- 抽象類與介面的區別抽象
- Java抽象類與介面的區別Java抽象
- 【Java基本功】聊聊抽象類和介面的區別Java抽象
- Java中抽象類與介面的區別Java抽象
- java中抽象類跟介面的區別Java抽象
- Java中抽象類和介面的介紹及二者間的區別Java抽象
- 運維和開發知識,Java中的抽象類和介面的兩大區別!運維Java抽象
- Java:面試題:抽象類與介面的區別Java面試題抽象
- 介面和抽象類的區別抽象
- 介面的行為抽象和抽象類的行為抽象抽象
- JAVA中介面和抽象類的區別Java抽象
- 多型和抽象類多型抽象
- Java 抽象類、普通類、介面的區別——值得你一看的乾貨Java抽象
- java基礎總結(面試高頻問題)十:java抽象類和介面的區別Java面試抽象
- java-介面和抽象類的聯絡和區別。Java抽象
- 抽象類和介面的相同點和不同點抽象
- 關於抽象類和介面的初步理解抽象
- 我是如何理解Java抽象類和介面的Java抽象
- Java 介面和抽象類是什麼,有什麼區別Java抽象
- Java 8 中的抽象類和介面到底有啥區別?Java抽象
- 抽象方法和抽象類抽象
- 抽象類和抽象方法抽象
- C#點滴 - 抽象類與介面區別C#抽象
- java抽象類和抽象方法Java抽象
- 繼承+多型+抽象類繼承多型抽象
- 介面和抽象類抽象
- 抽象類和介面抽象
- java 設計模式6原則 介面,抽象類區別Java設計模式抽象
- 菜鳥成長系列-多型、介面和抽象類多型抽象
- 第10章 物件和類——物件和類(六) 抽象資料型別物件抽象資料型別
- 用介面和抽象類,與不用究竟究竟有什麼區別或好處?抽象
- java抽象類與介面的詳細詮釋Java抽象
- 一文打盡Java抽象類和介面的相關問題Java抽象
- java多型抽象類例項Java多型抽象
- SATA介面和M.2介面的固態硬碟哪個好?SSD硬碟SATA介面和M.2介面的區別硬碟
- RPC介面和http介面的區別RPCHTTP