天天看點

《.NET程式員面試秘笈》----面試題10 接口和抽象類該如何取舍

本節書摘來自異步社群《.net程式員面試秘笈》一書中的第1章,面試題10,作者: 張雲翯, 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

.net程式員面試秘笈

【考點】抽象類的了解,抽象類和接口的差別。

【出現頻率】

【解答】

接口和抽象類非常相似,兩者都無法執行個體化,并且未實作部分都由派生類實作,其應用模型如圖1.14所示。

結合圖1.14可知,接口與抽象類的主要差別有以下幾點:

(1)抽象類隻能派生類,而接口可以派生類和結構。

(2)抽象類的派生類也可以是抽象類,即抽象成員在派生類中不一定被完全實作。而接口要求其派生類或結構必須完全實作其成員。

(3)抽象類可以包含已經實作的成員,可以包含字段,而接口隻包含未實作的成員,不能包含字段。并且接口及所含成員必須為public通路級别。

(4)類隻能繼承一個抽象類,但可以繼承(實作)多個接口。

《.NET程式員面試秘笈》----面試題10 接口和抽象類該如何取舍

在具體的程式設計中,抽象類和接口的取舍應視程式的需要而定。抽象類可以用于歸納一組相似的、有共同特性的類,然後将這些類共同的成員提取到抽象類中,使抽象類作為這組類的基類。這樣做到了代碼的複用,不但節約了代碼量,也減輕了維護的複雜度。然後将這組類中相似的方法或屬性提取到抽象類中,成為抽象類的抽象成員,不提供具體實作,由這組類自己完成不同的實作。

說明:

抽象類的應用非常類似于網頁制作中的css外部樣式檔案,大量風格相同的頁面可以共用這個css檔案,并且在頁面中可以對部分css屬性進行改寫。

而接口是一組類的功能集合,也可以說是一組類的協定集合,這組類負責實作這些功能,可以說接口内含的成員都是抽象的。類可以實作多個接口,這樣可将意圖和實作分離,接口可以暴露給其他程式直接使用,并且可以很友善地進行功能的擴充。兩者的應用對比如圖1.14所示。

本例以computer為接口,通過pca類和pcb類實作該接口的功能。在ch01目錄下建立一個程式檔案,并命名為abstract.cs,編寫代碼如程式1.11所示。

《.NET程式員面試秘笈》----面試題10 接口和抽象類該如何取舍
《.NET程式員面試秘笈》----面試題10 接口和抽象類該如何取舍

在指令行下編譯abstract.cs後,執行abstract程式,其效果如圖1.15所示。

《.NET程式員面試秘笈》----面試題10 接口和抽象類該如何取舍

https://yqfile.alicdn.com/815a6d43015ae8430def24d12763e6fae330d9d7.png" >

本例代碼中聲明了名為person的抽象類,類體中聲明了兩個抽象成員(1個方法和1個屬性),jacky類和femal類繼承了person類。而femal類隻實作了抽象屬性,是以female必須仍然是抽象類,并且編寫了mariah類繼承female類,mariah類實作了所繼承的抽象方法。而jacky類完全實作了person類的抽象成員,是以jacky類可以不是抽象類,可以建立執行個體。

程式運作時,建立jacky類的執行個體a,并直接輸出其_msg字段,還調用了a的getname方法,并通路了ismale屬性。然後建立mariah類的執行個體b,并進行相同的操作。從程式結果中可看出,person抽象類的_msg字段為所有派生類的可複用字段,是派生類共同的部分。隻有完全實作了person類抽象成員的類才可以不是抽象類,如jacky類,而沒有完全實作的類如female類仍然為抽象類。

【分析】

抽象類是一種用abstract關鍵字修飾的類,這種類僅用于被繼承。類似于接口,抽象類無法建立執行個體,而類體可以聲明多個未實作的抽象成員,這些成員由繼承此類的派生類實作。其編寫方法如以下代碼所示:

可見,抽象類的類體中可包含實作的成員,而未實作的成員為抽象成員。抽象方法或屬性本身就是隐性的virtual,是以派生類實作抽象方法或屬性必須使用override關鍵字。繼承抽象類的類如果沒有完全實作抽象成員,仍然隻能是抽象類,即派生的非抽象類必須完全實作抽象成員。抽象類也可以實作接口,這時抽象類必須實作所有的接口成員,也可以将繼承的接口成員映射至抽象成員,并由其派生類來實作。

抽象類的抽象成員不能使用virtual或static修飾。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀