http://book.51cto.com/art/201009/224017.htm 第4章 面向對象程序設計 本章覆蓋了.NET面試筆試中的對象、事件和委托等方面的題目。這一類題目屬于實戰(zhàn)類問題,涉及的知識點在面試中經常會出現(xiàn),但有不少程序員無法正確回答此類問題。建議讀者在實際研發(fā)的過程中,多多反思本章列出的各類題目,以期加強對這些問題的理解。 4.1 對象(1) C#是主流的面向對象編程語言之一,它不僅語法簡潔優(yōu)美,而且它完美地支持面向對象的封裝、繼承和多態(tài),在使用面向對象編程語言開發(fā)之前,筆者提倡先了解掌握面向對象的編程思想。在本節(jié)中,將集中講解覆蓋.NET面試中和面向對象思想有關的面試題。本節(jié)也是比較重要的章節(jié)之一,希望讀者能認真閱讀本章節(jié)的內容。 面試題46 類和結構有什么區(qū)別 這是一個關于C#語法的面試題,了解和記住這樣的語法并不困難。但建議讀者在得知答案后反復推敲類和結構的特性,充分掌握它們的特性。 【出現(xiàn)頻率】★★★★★ 【關鍵考點】 類 結構 【考題分析】 在C#中,類是功能最為強大的數(shù)據(jù)類型,類定義了數(shù)據(jù)類型的數(shù)據(jù)和行為。程序員可以創(chuàng)建類的實例對象。下面代碼展示了一個標準的C#類。
C#中的結構是使用struct關鍵字進行定義的,結構是值類型。下面代碼展示了一個標準的C#結構。
結構與類有以下3個方面的區(qū)別 結構是值類型,而類是引用類型。 結構不能被另外一個結構或者類繼承,自身也不能被繼承。而類完全可以被其他的類繼承,其自身也能被繼承。 結構沒有默認的構造函數(shù),也沒有析構函數(shù),并且不能有protected修飾符,但可以不使用new進行初始化。而類有默認的構造函數(shù),也有析構函數(shù),還有protected修飾符,并且必須使用new進行初始化。 注意:結構不能直接被類或結構繼承,但結構能夠繼承接口。 【答案】 雖然結構與類的初始化都能使用new操作符,但它們之間的差別較大,主要體現(xiàn)在3個方面:結構是值類型,而類是引用類型;結構不能被繼承而類可以;結構與類的內部結構不同。 面試題47 簡述C#中的虛方法 C#中的虛方法是最常見的考題之一,應聘者需對這個題目做好充分的準備。本小節(jié)將介紹這方面的知識。 【出現(xiàn)頻率】★★★★★ 【關鍵考點】 虛方法(virtual) 虛方法的實現(xiàn) 【考題分析】 使用virtual關鍵字修飾的方法就是虛方法。下面展示一段標準的C#虛方法的實現(xiàn)。
在上面的代碼中,基類contact定義了一個虛方法print(),而子類里也定義了一個用override 關鍵字修飾的print()方法。當筆者在主程序中調用子類的print()時,程序輸出的結果是:
可以通過運行結果進行分析,程序調用的是子類的print()方法,而不是基類的print()方法,說明override關鍵字的作用是覆蓋基類的虛方法。當然程序員也可以注銷子類中的print()方法,再次運行上面的代碼,程序輸出結果是:
此次程序調用的是基類print方法,說明虛方法提供了實現(xiàn)部分,當子類沒有重載基類的方法,默認調用的就是基類方法中的實現(xiàn)部分。 注意:當使用virtual關鍵字修飾符后,不允許再同時使用abstract、static或override關鍵字進行修飾。 【答案】 使用virtual關鍵字修飾的方法就是虛方法,虛方法(virtual)的關鍵字用于修飾屬性、方法、索引器或事件聲明,并使它們可以在派生類中被重寫。虛方法必須并提供派生類覆蓋該方法的選項,并且必須有實現(xiàn)部分。虛方法的作用是可以在派生類中被重寫。
4.1 對象(2) 面試題48 簡述C#中的密封類和密封方法 C#中的密封類和密封方法是一個語法類的面試題,也是最常見的考題之一。本小節(jié)將重點介紹這方面的知識。 【出現(xiàn)頻率】★★★★★ 【關鍵考點】 密封類 密封方法 【考題分析】 密封類使用sealed關鍵字進行修飾,它不能用作其他類的基類,并且它沒有派生類。下面是一段簡單的實例代碼。
密封方法(sealed)是使用sealed關鍵字進行修飾的方法,它并不影響類的繼承,但它可以防止重寫基類中特定的虛方法。下面是一段簡單的實例代碼。
【答案】 密封類使用sealed關鍵字進行修飾,它不能用作其他類的基類,并且它沒有派生類。密封類的作用是防止其他類繼承該類。密封方法是使用sealed關鍵字進行修飾的方法,它并不影響類的繼承,但它可以防止重寫基類中特定的虛方法。 面試題49 請介紹C#中靜態(tài)類構造方法的特點 C#中靜態(tài)類構造方法及特點是一道常見的面試題,靜態(tài)類構造是很有用的一個功能,程序員應該掌握這方面的應用。本小節(jié)將簡單地介紹靜態(tài)類中的構造方法。 【出現(xiàn)頻率】★★★★★ 【關鍵考點】 靜態(tài)類 構造方法 構造方法的特點 【考題分析】 構造方法是一種特殊的方法,一般用于初始化對象,并且在類實例化之前執(zhí)行,用于完成對象創(chuàng)建前所需的相關設定。構造方法也稱為構造函數(shù),只要創(chuàng)建類或結構,就會調用它的構造函數(shù)。類或結構可能有多個接收不同參數(shù)的構造函數(shù)。 下面的示例代碼展示了一個構造方法。
通過運行上面的代碼可以發(fā)現(xiàn),C#中的構造方法有以下4個特點。 只允許有一個無參的靜態(tài)構造方法在一個類中存在。 靜態(tài)的構造方法不會被繼承。 在所有靜態(tài)成員被引用之前執(zhí)行靜態(tài)構造方法。 在所有的構造方法中最先被執(zhí)行的是靜態(tài)的構造方法。 說明:靜態(tài)構造方法,是在構造方法的名字前使用static關鍵字修飾符的構造方法。 【答案】 C#中靜態(tài)類構造方法主要有4大特點,靜態(tài)構造方法最主要的特點是:靜態(tài)的構造方法是最先被執(zhí)行的構造方法,并且在一個類里只允許有一個無參的靜態(tài)構造方法。
4.1 對象(3) 面試題50 簡述C#派生類中的構造函數(shù) 這個問題是一道基礎的面試題,主要考察應聘者對派生類和構造方法的概念。本小節(jié)將簡單地介紹派生類與構造方法。 【出現(xiàn)頻率】★★★★ 【關鍵考點】 派生類 構造方 【考題分析】 派生類中的對象不但包含從基類繼承的成員對象,也包含了局部定義的成員對象。這時會出現(xiàn)一個問題:基類中有一部分構造函數(shù),而在派生類中也有一些構造函數(shù),當創(chuàng)建派生類對象時,到底運行的是那些構造函數(shù)呢?帶著這個問題先看下面一段代碼。
運行上面的代碼,請讀者注意base與this這兩個關鍵字的作用:
派生類中的base關鍵字表示當調用UnitCircle(double unitRadius)構造函數(shù)時,它實際調用的是基類中的Circle(double initialRadius)構造函數(shù)。 而派生類中的this關鍵字表示當調用的構造函數(shù),是本派生類中的構造函數(shù)。
【答案】 使用C#派生類中的構造函數(shù)時,需要注意關鍵字base與this的區(qū)別,關鍵字base表示調用基類中的構造函數(shù),而this表示調用本類中的構造函數(shù)。 面試題51 簡述接口及接口繼承 在大多數(shù)面向對象的語言中,都有接口這個概念,這些機制是設計高可擴展性的面向對象程序的基礎。讀者應該做到不僅了解它們的功能、讀懂包含這些概念的代碼,也能進一步地運用它們設計出面向對象的程序。 【出現(xiàn)頻率】★★★★★ 【關鍵考點】 接口(Interface) 接口特性 接口繼承 【考題分析】 接口是面向對象編程思想重要特性之一,接口是當把多個繼承類中的公共對象部分抽象出來、并封裝這些公共對象的行為。接口是為了繼承而存在的,如果沒有繼承,也就不需要接口的存在。 注意:在C#中,類可以通過繼承多個接口來豐富自己的行為機制,但類是不可以繼承多個類的。 在C#中,接口具有以下9大特性。 接口只定義,不包含方法的實現(xiàn)。 接口可以包含方法、屬性、事件和索引器。 接口成員必須是公共的。 接口不能被直接實例化。 接口不能包含任何字段。 接口描述可屬于任何類或結構的一組相關行為。 接口自身均可以從多個接口繼承。 類和結構均可以從多個接口繼承。 接口類似于抽象類,但繼承接口的類型必須實現(xiàn)接口中的所有定義的成員對象。 下面代碼實現(xiàn)了一個簡單的信號燈功能,代碼如下:
在代碼中,筆者首先定義了一個信號燈規(guī)則的接口,隨后在接口中定義了一個實現(xiàn)信號的方法。代碼如下:
注意:在筆者定義的接口中僅僅是聲明定義了一個方法,并沒有任何代碼功能的實現(xiàn)。信號燈功能的實現(xiàn)是在它的繼承類MyPupil中實現(xiàn)。結合前面對接口及接口繼承的特性的說明,就不難理解這段實例代碼。 【答案】 接口是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合。當定義了接口,就必須在繼承類中實現(xiàn)它,這樣類就支持接口中所指定的所有屬性和成員。 |
|