第7章 繼承和接口設計 習題_第1頁
第7章 繼承和接口設計 習題_第2頁
第7章 繼承和接口設計 習題_第3頁
第7章 繼承和接口設計 習題_第4頁
第7章 繼承和接口設計 習題_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第7章 繼承和接口設計一選擇題1在C#中,一個類【 】。A) 可以繼承多個類B) 可以實現(xiàn)多個接口C) 在一個程序中只能有一個子類D) 只能實現(xiàn)一個接口2【 】關鍵字用于在C#中從派生類中訪問基類的成員。A) newB) superC) thisD) base3在定義類時,若希望類的某個方法能夠在派生類中進一步改進,以滿足派生類的不同需要,則應將該方法聲明為【 】。A) newB) publicC) virtualD) override4在C#中,在派生類中對基類的虛方法進行重寫,要求在派生類的聲明中使用【 】。A) newB) publicC) virtualD) override5已知類B

2、是由類A繼承而來,類A中有一個名為M的非虛方法,現(xiàn)在希望在類B中也定義一個名為M的方法,且兩方法的參數(shù)個數(shù)和類型完全相同,若希望編譯時不出現(xiàn)警告信息,則在類B中聲明該方法時,應使用【 】關鍵字。A) staticB) newC) overrideD) virtual6假設類B繼承了類A,下列說法錯誤的是【 】。A) 類B中的成員可以訪問類A中的公有成員B) 類B中的成員可以訪問類A中的保護成員C) 類B中的成員可以訪問類A中的私有成員D) 類B中的成員可以訪問類A中的靜態(tài)成員7關于多態(tài),下列說法正確的是【 】。A) 多態(tài)實際上就是重載,它們本質上是以一樣的B) 多態(tài)可以分為編譯時多態(tài)和運行時多

3、態(tài)。前者的特點是在編譯時就能確定要調用成員方法的哪個版本,后者則是在程序運行時才能確定要調用成員方法的哪個版本。C) 編譯時多態(tài)是在程序運行時才能確定要調用成員方法的哪個版本,而運行時多態(tài)在編譯時就能確定要調用成員方法的哪個版本。D) 多態(tài)和重載是兩個完全不同的概念,前者是通過定義虛方法和重寫虛方法來實現(xiàn),后者是通過對同一函數(shù)名編寫多個不同的實現(xiàn)代碼來實現(xiàn)。8下列關于接口的說法,正確的是【 】。A) 接口中定義的方法都必須是虛方法B) 接口中定義的方法可以編寫其實現(xiàn)代碼C) 繼承接口的類可提供被繼承接口中部分成員的實現(xiàn)代碼D) 接口中的所有方法都必須在其派生類中得到實現(xiàn)。9下列關于虛方法的描述

4、中,正確的是【 】。A) 虛方法能在程序執(zhí)行時動態(tài)確定要調用的方法,因此比非虛方法更靈活B) 在定義虛方法時,基類和派生類的方法定義語句中都要帶上virtual修飾符C) 在重寫基類的虛方法時,為消除隱藏基類成員的警告,需要帶上new修飾符D) 在重寫基類的虛方法時,需要同時帶上virtual和override修飾符10在C#中,以下關于抽象類的敘述中錯誤的是【 】。A) 抽象類可以包含抽象方法B) 含有抽象方法的類一定是抽象類C) 抽象類不能被實例化D) 抽象類可以是密封類11在C#中,以下關于抽象類和接口的敘述中正確的是【 】。A) 抽象類可以包含非抽象方法,而接口不包含任何方法的實現(xiàn)B)

5、 抽象類可以被實例化,而接口不能被實例化C) 抽象類不能被實例化,而接口可以被實例化D) 抽象類能夠被繼承,而接口不能被繼承12在C#中,以下關于抽象類和接口的敘述中正確的是【 】。A) 在抽象類中,所有的方法都是抽象方法B) 繼承自抽象類的子類必須實現(xiàn)其父類(抽象類)中的所有抽象方法C) 在接口的定義中可以有方法實現(xiàn),在抽象類的定義中不能有方法實現(xiàn)D) 一個類可以從多個接口繼承,也可以從多個抽象類繼承13以下類和接口的區(qū)別中正確的是【 】。A) 類可以繼承而接口不可以B) 類不可以繼承而接口可以C) 類可以多繼承而接口不可以D) 類不可以多繼承而接口可以14下列方法定義中,【 】是抽象方法。

6、A) static void func() B) virtual void func() C) abstract void func() D) overridel void func() 15下列關于接口的說法,錯誤的是【 】。A) 一個類可以有多個基類和多個基接口B) 抽象類和接口都不能被實例化C) 抽象類自身可以定義成員,而接口不可以D) 類不可以多重繼承,而接口可以。16已知類Base、Derived的定義如下:class Base public void Hello() System.Console.Write(“Hello in Base!”); class Derived: Bas

7、epublic new void Hello() System.Console.Write(“Hello in Derived!”); 則下列語句段在控制臺中的輸出結果是【 】。Derived x=new Derived(); x.Hello();A) Hello in Base!B) Hello in Base! Hello in Derived!C) Hello in Derived!D) Hello in Derived!Hello in Base!17關于繼承,下列說法正確的是【 】。A) 子類將繼承父類所有的成員B) 子類將繼承父類的非私有成員C) 子類只繼承父類public成員D)

8、 子類只繼承父類的方法,而不繼承屬性18下列是抽象類的聲明的是【 】。A) abstract class figure B) class abstract figure C) seald class figure D) static class figure19abstract修飾的方法是抽象方法,抽象方法只有聲明而無主體,且【 】。A) 只能存在于抽象類中B) 可以在任何類中C) 只能在接口中D) 只能在密封類中20重寫一個基類的虛方法時,應與原虛方法的方法名相同,并且【 】。A) 不能改變方法的參數(shù)類型、個數(shù)和返回值B) 可以改變方法的參數(shù)類型、個數(shù)和返回值C) 可以改變方法的返回值D)

9、可以改變方法的參數(shù)類型和個數(shù)21下面有關繼承的說法中,正確的是【 】。A) A類和B類均有C類需要的成員,因此可以從A類和B類共同派生出C類B) 在派生新類時,可以指明是公有派生、私有派生或保護派生C) 派生類可以繼承基類中的成員,同時也繼承基類的父類中的成員D) 在派生類中,不能添加新的成員,只能繼承基類的成員22為了防止從所修飾的類派生出其他類,可以將此類定義為【 】。A) 抽象類B) 密封類C) 靜態(tài)類D) 私有類23若想從派生類中訪問基類的成員,可以使用【 】。A) this關鍵字B) me關鍵字C) base關鍵字D) override關鍵字24下面有關派生類的描述中,不正確的是【

10、】。A) 派生類可以繼承基類的構造函數(shù)B) 派生類可以隱藏和重載基類的成員C) 派生類不能訪問基類的私有成員D) 派生類只能有一個直接基類25C#中的多態(tài)不能通過【 】實現(xiàn)。A) 接口B) 抽象類C) 密封類D) 虛方法26下列程序錯誤的原因是【 】。sealed class SealedClassclass Derived:SealedClassA) SealedClass類不能被繼承B) 沒有Main()入口C) SealedClass沒有被實例化D) 以上皆是27下面關于接口的敘述中,不正確的是【 】。A) 接口只是由方法、屬性、索引器或事件組成的框架,并沒有描述任何對象的實例代碼B)

11、接口的所有成員都被自動定義為公有的,不可使用訪問修飾符來定義接口成員C) 類可以通過在類型定義語句中包括冒號和接口名來表明它正在實現(xiàn)接口D) 一個類只能實現(xiàn)一個接口28接口可以包含一個或多個成員,以下選項中【 】不能包含在接口中。A) 方法B) 屬性C) 事件D) 常量29下列敘述中,正確的是【 】。A) 接口中可以有虛方法B) 一個類可以實現(xiàn)多個接口C) 接口能被實例化D) 接口中可以包含已實現(xiàn)的方法30. 關于虛方法實現(xiàn)多態(tài),下列說法錯誤的是【 】。A) 定義虛方法使用關鍵字virtual B) 關鍵字virtual可以與override一起使用C) 虛方法是實現(xiàn)多態(tài)的一種應用形式 D)

12、派生類是實現(xiàn)多態(tài)的一種應用形式31. 以下類MyClass的定義中,【 】是合法的抽象類。A) abstract class MyClass public abstract int getCount(); B) abstract class MyClass public virtual abstract int getCount(); C) abstract class MyClass private abstract int getCount(); D) abstract class MyClass public static abstract int getCount(); 32. 分析下

13、列程序中類MyClass的定義class BaseClasspublic int i;class MyClass:BaseClasspublic new int i;則下列語句在Console 上的輸出為【 】。MyClass y = new MyClass();BaseClass x = y;x.i = 100;Console.WriteLine(0, 1,x.i,y.i);A) 0, 0B) 100, 100C) 0, 100D) 100, 033. 在C#程序中定義如下IPlay接口,實現(xiàn)此接口代碼正確的是【 】。interface IPlay void Play();void Show

14、();A) class Teacher :Iplay void Play() /省略部分代碼 void Show0 /省略部分代碼B) class Teacher :Iplay public string Play() /省略部分代碼 public void Show0 /省略部分代碼C) class Teacher :Iplay public void Play() /省略部分代碼 public void Show0 /省略部分代碼D) class Teacher :Iplay public void Play();public void Show0 /省略部分代碼 34. 以下泛型集合聲明

15、中正確的是【 】。A) List f=new List(); B) List f=new List (); C) List f=new List (); D) List f=new List; 34. 以下關于泛型的敘述中錯誤的是【 】。A) 泛型是通過參數(shù)化類型來實現(xiàn)在同一份代碼上操作多種數(shù)據(jù)類型B) 泛型編程是一種編程范式,其特點是參數(shù)化類型,C) 泛型類型和普通類型的區(qū)別在于泛型類型與一組類型參數(shù)或類型變量關聯(lián)D) 以上都不對二填空題1在C#中有兩種多態(tài)性:編譯時的多態(tài)性和運行時的多態(tài)性。編譯時的多態(tài)性是通過【虛方法和重寫虛方法 】實現(xiàn)的,運行時的多態(tài)性是通過繼承和【重載/隱藏 】來實現(xiàn)

16、的。2在聲明類時,在類名前使用【abstract】修飾符,則聲明的類只能作為其他類的基類,不能被實例化。3在聲明類時,在類名前使用【 sealed 】修飾符,則聲明的類不能作為其他類的基類,不能再派生新的類。4. 下列程序的運行結果是【AB 】。考察類的繼承(構造函數(shù)是先基類的先構造,析構函數(shù)是子類先析構)class Apublic A( )Console.WriteLine(A);class B:Apublic B()Console.WriteLine(B);class Programpublic static void Main()B b = new B();Console.ReadLin

17、e();5. 分析下列程序的運行結果是【 】??疾祛惖睦^承中base的使用class Apublic int x=100;class B:Anew public int x;public B(int y, int z) x=y;base.x=z; public int getx1() return base.x; public int getx2() return x; class Program public static void Main() B b = new B(3, 6); int n = b.getx1(); int m = b.getx2(); Console.WriteLin

18、e(m=0,n=1, m, n); m=3,n=66. 分析下列程序的運行結果是【 】??疾祛惖睦^承(隱藏和重寫)abstract class BaseClasspublic void MethodA() Console.WriteLine(BaseClass.MethodA); public virtual void MethodB() Console.WriteLine(BaseClass.MethodB); class Class1 : BaseClass new public void MethodA() Console.WriteLine(Class1.MethodA); publi

19、c override void MethodB() Console.WriteLine(Class1.MethodB); class Class2 : Class1 new public void MethodB() Console.WriteLine(Class2.MethodB); class MainClass public static void Main(string args) Class2 a = new Class2(); a.MethodA(); a.MethodB(); Console.Read(); Class1.MethodAClass2.MethodB7下列程序的運行

20、結果是【AA CC DD DD 】。考察類的繼承(隱藏和重寫)class A public void F1() Console.Write(AA ); public virtual void F2() Console.Write(BB ); class B : Anew public void F1() Console.Write(CC ); public override void F2() Console.Write(DD ); class Test static void Main() B b = new B(); A a = b; a.F1(); b.F1(); a.F2(); b.F

21、2(); Console.Read();8. 閱讀下列程序,程序的輸出結果是【 】??疾祛惖睦^承public class A private int speed =10; public int Speed get return speed; set speed = value; Console.WriteLine(禁止駛入!); public class B:A public B() if(this.Speed=20) Console.Write (機動車); else Console.Write (非機動車); class Program public static void Main()

22、B b=new B(); b.Speed = 30; 非機動車禁止駛入!9. 閱讀下列程序,程序的輸出結果是【 】??疾祛惖睦^承public class Personprivate int age = 0; public int Age get return age; set if(value=18) Console.Write(成年人); else Console.Write(未成年人); age = value; public class People : Person public People(int age) Age = age; Console.WriteLine(不得入內); c

23、lass Program public static void Main() People b = new People (25); Console .WriteLine(你的年齡是:0,b.Age); Console.Read(); 成年人不得入內你的年齡是:2510. 閱讀下列程序,程序的輸出結果是【 】??疾旖涌诘挠成鋓nterface IA void Hello(); class Base:IA public void Hello() Console.WriteLine(Hello in Base!); class Derived:Base new public void Hello(

24、) Console.WriteLine(Hello in Derived!); class Program public static void Main() Base b=new Base(); Derived d=new Derived (); IA x; b.Hello();d.Hello(); x=b;x.Hello();x=d;x.Hello(); Console.Read();Hello in Base!Hello in Derived!Hello in Base!Hello in Base!11. 閱讀下列程序,程序的輸出結果是【 】??疾旖涌诘挠成鋓nterface IA vo

25、id Hello(); class Base:IA public void Hello() Console.WriteLine(Hello in Base!); class Derived:IA new public void Hello() Console.WriteLine(Hello in Derived!); class Program public static void Main() Base b=new Base(); Derived d=new Derived (); IA x;x=b; x.Hello();x=d; x.Hello(); Console.Read();Hell

26、o in Base!Hello in Derived!12. 閱讀下列程序,程序的輸出結果是【 】??疾旖涌诘挠成鋓nterface Ia /接口Ia聲明 double fun1(); /接口成員聲明 int fun2(); /接口成員聲明 class A /聲明基類A public int fun2() /隱式實現(xiàn)接口成員fun2 return 2; class B : A, Ia /類B從基類A和接口繼承 double x; public B(double y) /構造函數(shù) x = y; public double fun1() /隱式實現(xiàn)接口成員fun1 return x; class

27、Program static void Main(string args) B b = new B(2.5); Console.WriteLine(0 , b.fun1(); Console.WriteLine(0 , b.fun2(); Console.Read(); 2.5212. 閱讀下列程序,程序的輸出結果是【 】??疾祛惖膶崿F(xiàn)與泛型class Stack /聲明棧泛型類 int maxsize;/棧中元素最多個數(shù) T data;/存放棧中T類型的元素 int top;/棧頂指針 public Stack()/構造函數(shù) maxsize = 10; data = new Tmaxsize

28、; top = -1; public Stack(int n)/重載構造函數(shù) maxsize = n; data = new Tmaxsize; top = -1; public bool StackEmpty()/判斷??辗椒?return top = -1; public bool Push(T e) /元素e進棧方法 if (top = maxsize - 1)return false; top+; datatop = e; return true; public bool Pop(ref T e)/元素出棧方法 if (top = -1)return false; e = datato

29、p; top-; return true; class Program static void Main(string args) int e = 0; Stack s = new Stack(); /定義整數(shù)棧 s.Push(1);s.Push(3); s.Push(2); Console.Write(整數(shù)棧出棧次序:); while (!s.StackEmpty() /棧不空時出棧元素 s.Pop(ref e); Console.Write(0 , e); Console.WriteLine(); string e1 = ; Stack s1 = new Stack(); /定義字符串棧

30、s1.Push(Mary);s1.Push(John); s1.Push(Simth); Console.Write(字符串棧出棧次序:); while (!s1.StackEmpty()/棧不空時出棧元素 s1.Pop(ref e1); Console.Write(0 , e1); Console.ReadLine(); 整數(shù)棧出棧次序:2 3 1字符串棧出棧次序:Simth John Mary三改錯題(說明:下列程序中部分下劃線的代碼有錯誤,請將有錯誤的部分改正過來,并說明原因)1class Apublic A(int x) class B:Apublic B(int x) 答:“publ

31、ic B(int x) ”應改為“public B(int x):base(x) ”。因為基類A中沒有無參數(shù)的構造函數(shù)。2class Avoid A() private A(int x) private A(int y) 答:“void A() ”應改為“A()”,因為構造函數(shù)不能帶任何返回類型修飾符?!皃rivate A(int x) ”和“private A(int y) ”實際上是同一個構造函數(shù),應刪除其中一個。3interface Iint x;public void f(int x);void g(int x);int h(int x) return 1; class A:Ipubl

32、ic void f(int x) public int h(int x) 答:“int x;”應予以刪除,因為接口中不允許存在成員變量?!皃ublic void f(int x);”中的修飾符“public”應予以刪除,因為接口的方法前不允許存在任何修飾符;“int h(int x) return 1; ” 應改為“int h(int x);”,因為不能在接口聲明的函數(shù)中編寫實現(xiàn)代碼;應該在類A中添加函數(shù)“void g(int x);”的實現(xiàn)代碼。4class A class B class C: A, B答:必須將“class C:A,B”中的“A”或“B”其中之一去掉,因為C#中不允許類進

33、行多重繼承。5class Aprotected static void f() protected void g() class B:Anew public static void f() new public void g() public void h() base.f();base.g();f(); g();答:“base.f();”應改為“A.f();”,原因是類A中的方法“f()”是靜態(tài)方法,它不能被實例化,只能通過類名來訪問。四問答題1什么是類的繼承?怎樣定義派生類?繼承是指一個類可以繼承另一個類中的相關成員,被繼承的類稱為基類、超類或父類,繼承而形成的類稱為派生類或子類利用繼承機

34、制,新的類可以從已有的類中派生。那些用于派生的類稱為這些特別派生出的類的“基類”2簡述創(chuàng)建派生類時,構造函數(shù)的調用。先創(chuàng)建基類的構造函數(shù),在創(chuàng)建自己的構造函數(shù)3怎樣定義基類虛方法,并在派生類中重寫基類虛方法?virtual 方法名(參數(shù)列表) 語句序列 override 方法名(參數(shù)列表) 語句序列 4抽象方法和虛方法有什么異同?抽象方法是只有定義、沒有實際方法體的函數(shù),它只能在抽象函數(shù)中出現(xiàn),并且在子類中必須重寫;虛方法則有自己的函數(shù)體,已經(jīng)提供了函數(shù)實現(xiàn),但是允許在子類中重寫或覆蓋。 重寫的子類虛函數(shù)就是被覆蓋了。5什么是抽象類?它有什么特點?它和接口有何異同?v 在方法聲明中使用abst

35、ract修飾符的方法即為抽象方法。6什么是方法重載?重載的方法有何特點?是多態(tài)性的表達 方法名相同,但是參數(shù)類型和個數(shù)不同五編程題1. 編寫一個控制臺應用程序項目,實現(xiàn)學生和教師數(shù)據(jù)輸入和顯示功能。學生類Student有編號、姓名、班號和成績等字段,教師類有編號、姓名、職稱和部門等字段。要求將編號、姓名輸入和顯示設計成一個類Person,并作為Student和Teacher的基類。需用相關數(shù)據(jù)進行測試。 public class Person /人類 private int no; /編號 private string name; /姓名 public void input() Console

36、.Write( 編號:); no = int.Parse(Console.ReadLine(); Console.Write( 姓名:); name = Console.ReadLine(); public void disp() Console.WriteLine( 編號:0,no); Console.WriteLine( 姓名:0,name); public class Student : Person /學生類 private string sclass; /班號 private int degree; /成績 public void input() base.input(); Cons

37、ole.Write( 班號:); sclass = Console.ReadLine(); Console.Write( 成績:); degree = int.Parse(Console.ReadLine(); new public void disp() base.disp(); Console.WriteLine( 班號:0,sclass); Console.WriteLine( 成績:0,degree); public class Teacher : Person /教師類 private string prof; /職稱 private string depart; /部門 publi

38、c void input() base.input(); Console.Write( 職稱:); prof = Console.ReadLine(); Console.Write( 部門:); depart = Console.ReadLine(); new public void disp() base.disp(); Console.WriteLine( 職稱:0, prof); Console.WriteLine( 部門:0, depart); class Program static void Main(string args) Student s1 = new Student();

39、 Teacher t1 = new Teacher(); Console.WriteLine(輸入一個學生數(shù)據(jù):); s1.input(); Console.WriteLine(輸入一個教師數(shù)據(jù):); t1.input(); Console.WriteLine(顯示一個學生數(shù)據(jù):); s1.disp(); Console.WriteLine(顯示一個教師數(shù)據(jù):); t1.disp(); 2. 設計一個控制臺應用程序項目b,設計一個普通職工類Employee,其工資為基本工資(1000)加上工齡工資(每年增加30元)。從Employee類派生出一個本科生類UEmployee,其工資為普通職工算法

40、的1.5倍。并用相關數(shù)據(jù)進行測試,測試效果圖如下圖所示??刂婆_應用程序項目b的執(zhí)行結果public class Employee /普通職工類 private double bsalary= 1000; /基本工資 private double psalary; /實際工資 private int n; /工作年數(shù) public int pn get return n; set n = value; public double compsalary() /計算普通員工工資 Console.Write(工作年數(shù):); pn = int.Parse(Console.ReadLine(); psal

41、ary = bsalary+30*pn; return psalary; public class UEmployee : Employee /本科生職工類 new public double compsalary() return 1.5 * psalary(); class Program static void Main(string args) Console.WriteLine(普通職工:); Employee emp1 = new Employee(); Console.WriteLine(該普通職工工資:0, psalary(); Console.

42、WriteLine(本科生職工:); UEmployee emp2 = new UEmployee(); Console.WriteLine(該本科生職工工資:0, psalary(); 說明:本題需采用繼承方法,用虛函數(shù)等均可。3定義一個Shape抽象類,在該類中定義兩個抽象方法GetArea和GetPerim。然后以Shape抽象類作為基類派生出Rectangle和Circle類,在這兩個類中分別對GetArea和GetPerim方法進行重寫,實現(xiàn)求特定形狀的面積和周長。抽象類方法實現(xiàn)public abstract class Shape public abstract d

43、ouble GetArea(); public abstract double GetPerim(); class Rectangle : Shape/派生出來的Rectangle類 private double Width;/矩形的寬度 private double Length; /矩形的長度 public Rectangle(double a, double b) /構造函數(shù) Width = a; Length = b; public override double GetArea() /重載的求面積方法 return (Width * Length); public override double GetPerim() /重載的求周長方法 return (2 * (Length + Width); class Circle : Shape /派生出的Circle類 private double Radius; public Circle(double r) /構造函數(shù) Radius = r; public override double GetArea() /重載的求面積方法 return (Math.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論