日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

.NET面試筆試中的對象

 雄Frank 2012-02-13

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#類。

  1. public class MyClass  
  2. {  
  3.     public string name;                 //定義字段  
  4.     public MyClass()                        //構(gòu)造方法  
  5.     {  
  6.         name = "unknown";  
  7.     }  
  8.     public void SetName(string newName) //無返回值的普通方法  
  9.     {  
  10.         name = newName;  
  11.     }  

C#中的結(jié)構(gòu)是使用struct關(guān)鍵字進行定義的,結(jié)構(gòu)是值類型。下面代碼展示了一個標(biāo)準(zhǔn)的C#結(jié)構(gòu)。

  1. public struct Book                      //定義一個結(jié)構(gòu)  
  2. {  
  3.     /*定義結(jié)構(gòu)中的成員變量*/  
  4.     public decimal price;  
  5.     public string title;  
  6.     public string author;  

結(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)。

  1. public class contact                    //定義contact類  
  2. {  
  3.     public virtual string print()       //用關(guān)鍵字virtual定義一個虛方法  
  4.     {  
  5.         return ("這是虛方法");  
  6.     }  
  7. }  
  8. public class MyClass : contact          //繼承contact類  
  9. {  
  10.     public override string print()      //重寫基類的print()方法  
  11.     {  
  12.         return ("這是新的方法");  
  13.     }  
  14. }  
  15. public static void Main()  
  16. {  
  17.     MyClass m = new MyClass();          //初始化MyClass()方法  
  18.     Console.WriteLine(m.print());       //調(diào)用print()方法  
  19.     Console.Read();  

在上面的代碼中,基類contact定義了一個虛方法print(),而子類里也定義了一個用override 關(guān)鍵字修飾的print()方法。當(dāng)筆者在主程序中調(diào)用子類的print()時,程序輸出的結(jié)果是:

  1. 這是新的方法 

可以通過運行結(jié)果進行分析,程序調(diào)用的是子類的print()方法,而不是基類的print()方法,說明override關(guān)鍵字的作用是覆蓋基類的虛方法。當(dāng)然程序員也可以注銷子類中的print()方法,再次運行上面的代碼,程序輸出結(jié)果是:

  1. 這是虛方法 

此次程序調(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)鍵字進行修飾,它不能用作其他類的基類,并且它沒有派生類。下面是一段簡單的實例代碼。

  1. class A {}                  //定義一個普通的class  
  2. sealed class B : A {}       //定義密封類  
  3. class C : B {}              //下面是錯誤的代碼,
    密封類是不能夠被其他類型繼承 

密封方法(sealed)是使用sealed關(guān)鍵字進行修飾的方法,它并不影響類的繼承,但它可以防止重寫基類中特定的虛方法。下面是一段簡單的實例代碼。

  1. class A  
  2. {  
  3.     protected virtual void F() { Console.
    WriteLine("A.F");}//定義一個虛方法  
  4. }  
  5. class B : A  
  6. {  
  7.     sealed protected override void F() {
    Console.WriteLine("B.F");}  
  8.                                                     
    //定義密封方法  
  9. }  
  10. class C : B  
  11. {  
  12.     //下面是一段錯誤的代碼,密封方法不能夠重寫  
  13.     protected override void F() { Console.WriteLine("C.F"); }  

【答案】

密封類使用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)造方法。

  1. class StaticSimple  
  2. {  
  3.     public static int k =100;               //定義靜態(tài)變量  
  4.     static StaticSimple()                   //創(chuàng)建
    自定義的靜態(tài)構(gòu)造方法  
  5.     {  
  6.         Console.WriteLine("請注意方法的執(zhí)行順序。");  
  7.     }  
  8.     //注釋的這段代碼是錯誤的代碼,在一個類里只允許有一
    個無參的靜態(tài)構(gòu)造方法  
  9.     //static StaticSimple(String str)  
  10.     //{  
  11.     //  Console.WriteLine("在一個類里只允許有一個
    無參的靜態(tài)構(gòu)造方法。");  
  12.     //}  
  13.     public StaticSimple()               //定義無
    參的構(gòu)造器,同時給j和s賦值  
  14.     {  
  15.         Console.WriteLine("這是無參構(gòu)造器");  
  16.     }  
  17. }  
  18. class Program  
  19. {  
  20.     static void Main(string[] args)  
  21.     {  
  22.     //先調(diào)用靜態(tài)成員k的值,結(jié)果會是先執(zhí)行靜態(tài)構(gòu)造方
    法,再顯示
    k=100 
  23.     Console.WriteLine("讀者請注意,在輸入k值請是
    否有其他的輸出。
    k=" + Static  
  24.     Simple.k);  
  25.     //此時不會再出現(xiàn)static構(gòu)造器的內(nèi)容,因為前面已經(jīng)執(zhí)行了一次  
  26.     StaticSimple A = new StaticSimple();  
  27.     Console.Read();  
  28.     }  

通過運行上面的代碼可以發(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ù)呢?帶著這個問題先看下面一段代碼。

  1. class Circle  
  2. {  
  3.     public Circle()                         //默認(rèn)構(gòu)造函數(shù)  
  4.     {  
  5.         Console.WriteLine("基類無參構(gòu)造方法。");  
  6.     }  
  7.     public Circle(double initialRadius) //帶一個參數(shù)的構(gòu)造函數(shù)  
  8.     {  
  9.         Console.WriteLine("基類有參構(gòu)造方法。");  
  10.     }  
  11. }  
  12. class UnitCircle : Circle                   //派生類  
  13. {  
  14.     public UnitCircle(double unitRadius) :base(unitRadius) {}  
  15.                                             //調(diào)用基類的構(gòu)造函數(shù)  
  16.     public UnitCircle():this(1,2)           //調(diào)用本類中的構(gòu)造函數(shù)  
  17.     {  
  18.         Console.WriteLine("派生類無參構(gòu)造方法。");  
  19.     }  
  20.     public UnitCircle(int i,int j)          //定義
    一個帶兩個參數(shù)的構(gòu)造函數(shù)  
  21.     {  
  22.         Console.WriteLine("派生類有參構(gòu)造方法。"+i.ToString());  
  23.     }  
  24. }  
  25. class Program  
  26. {  
  27.     static void Main(string[] args)  
  28.     {  
  29.             UnitCircle u = new UnitCircle();    //調(diào)用
    派生類中的無參構(gòu)造函數(shù)  
  30.         UnitCircle u1 = new UnitCircle(2);  
  31.                                         //調(diào)用派
    生類中的有一個參數(shù)的構(gòu)造函數(shù)  
  32.         Console.Read();  
  33.     }  

運行上面的代碼,請讀者注意base與this這兩個關(guān)鍵字的作用:

  1. public UnitCircle(double unitRadius) :base(unitRadius) {} 

派生類中的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ù)。

  1. public UnitCircle():this(1,2) 

【答案】

使用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)了一個簡單的信號燈功能,代碼如下:

  1. interface ITrafficRule                      //定義
    一個接口(交通規(guī)則)  
  2. {  
  3.    void CrossTheRoad(int trafficLight);     //定義
    一個方法(十字路口)  
  4. }  
  5. public class MyPupil : ITrafficRule  
  6. {  
  7.     public void CrossTheRoad(int trafficLight)  
  8.                                             //實現(xiàn)
    十字路口的信號燈功能的方法  
  9.     {  
  10.         switch (trafficLight)  
  11.         {  
  12.         case 0:                             //紅燈停  
  13.         …  
  14.         break;  
  15.         case 1:                             //黃燈等一等  
  16.          …  
  17.         break;  
  18.         case 2:                             //綠燈行  
  19.         …  
  20.         break;  
  21.         default:                //當(dāng)信號故障,且
    兩側(cè)沒有直行車輛時,可以穿過馬路  
  22.         …  
  23.         break;  
  24.         }  
  25.     }  

在代碼中,筆者首先定義了一個信號燈規(guī)則的接口,隨后在接口中定義了一個實現(xiàn)信號的方法。代碼如下:

  1. interface ITrafficRule  
  2. {  
  3.     void CrossTheRoad(int trafficLight);        
    //定義一個方法(十字路口)  

注意:在筆者定義的接口中僅僅是聲明定義了一個方法,并沒有任何代碼功能的實現(xiàn)。信號燈功能的實現(xiàn)是在它的繼承類MyPupil中實現(xiàn)。結(jié)合前面對接口及接口繼承的特性的說明,就不難理解這段實例代碼。

【答案】

接口是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合。當(dāng)定義了接口,就必須在繼承類中實現(xiàn)它,這樣類就支持接口中所指定的所有屬性和成員。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多