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