继承和接口设计 习题_第1页
继承和接口设计 习题_第2页
继承和接口设计 习题_第3页
继承和接口设计 习题_第4页
继承和接口设计 习题_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章 继承和接口设计一选择题1在C#中,一个类【 】。A) 可以继承多个类B) 可以实现多个接口C) 在一个程序中只能有一个子类D) 只能实现一个接口2【 】关键字用于在C#中从派生类中访问基类的成员。A) newB) superC) thisD) base3在定义类时,若希望类的某个方法能够在派生类中进一步改进,以满足派生类的不同需要,则应将该方法声明为【 】。A) newB) publicC) virtualD) override4在C#中,在派生类中对基类的虚方法进行重写,要求在派生类的声明中使用【 】。A) newB) publicC) virtualD) override5已知类B

2、是由类A继承而来,类A中有一个名为M的非虚方法,现在希望在类B中也定义一个名为M的方法,且两方法的参数个数和类型完全相同,若希望编译时不出现警告信息,则在类B中声明该方法时,应使用【 】关键字。A) staticB) newC) overrideD) virtual6假设类B继承了类A,下列说法错误的是【 】。A) 类B中的成员可以访问类A中的公有成员B) 类B中的成员可以访问类A中的保护成员C) 类B中的成员可以访问类A中的私有成员D) 类B中的成员可以访问类A中的静态成员7关于多态,下列说法正确的是【 】。A) 多态实际上就是重载,它们本质上是以一样的B) 多态可以分为编译时多态和运行时多

3、态。前者的特点是在编译时就能确定要调用成员方法的哪个版本,后者则是在程序运行时才能确定要调用成员方法的哪个版本。C) 编译时多态是在程序运行时才能确定要调用成员方法的哪个版本,而运行时多态在编译时就能确定要调用成员方法的哪个版本。D) 多态和重载是两个完全不同的概念,前者是通过定义虚方法和重写虚方法来实现,后者是通过对同一函数名编写多个不同的实现代码来实现。8下列关于接口的说法,正确的是【 】。A) 接口中定义的方法都必须是虚方法B) 接口中定义的方法可以编写其实现代码C) 继承接口的类可提供被继承接口中部分成员的实现代码D) 接口中的所有方法都必须在其派生类中得到实现。9下列关于虚方法的描述

4、中,正确的是【 】。A) 虚方法能在程序执行时动态确定要调用的方法,因此比非虚方法更灵活B) 在定义虚方法时,基类和派生类的方法定义语句中都要带上virtual修饰符C) 在重写基类的虚方法时,为消除隐藏基类成员的警告,需要带上new修饰符D) 在重写基类的虚方法时,需要同时带上virtual和override修饰符10在C#中,以下关于抽象类的叙述中错误的是【 】。A) 抽象类可以包含抽象方法B) 含有抽象方法的类一定是抽象类C) 抽象类不能被实例化D) 抽象类可以是密封类11在C#中,以下关于抽象类和接口的叙述中正确的是【 】。A) 抽象类可以包含非抽象方法,而接口不包含任何方法的实现B)

5、 抽象类可以被实例化,而接口不能被实例化C) 抽象类不能被实例化,而接口可以被实例化D) 抽象类能够被继承,而接口不能被继承12在C#中,以下关于抽象类和接口的叙述中正确的是【 】。A) 在抽象类中,所有的方法都是抽象方法B) 继承自抽象类的子类必须实现其父类(抽象类)中的所有抽象方法C) 在接口的定义中可以有方法实现,在抽象类的定义中不能有方法实现D) 一个类可以从多个接口继承,也可以从多个抽象类继承13以下类和接口的区别中正确的是【 】。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) 不能改变方法的参数类型、个数和返回值B) 可以改变方法的参数类型、个数和返回值C) 可以改变方法的返回值D)

9、可以改变方法的参数类型和个数21下面有关继承的说法中,正确的是【 】。A) A类和B类均有C类需要的成员,因此可以从A类和B类共同派生出C类B) 在派生新类时,可以指明是公有派生、私有派生或保护派生C) 派生类可以继承基类中的成员,同时也继承基类的父类中的成员D) 在派生类中,不能添加新的成员,只能继承基类的成员22为了防止从所修饰的类派生出其他类,可以将此类定义为【 】。A) 抽象类B) 密封类C) 静态类D) 私有类23若想从派生类中访问基类的成员,可以使用【 】。A) this关键字B) me关键字C) base关键字D) override关键字24下面有关派生类的描述中,不正确的是【

10、】。A) 派生类可以继承基类的构造函数B) 派生类可以隐藏和重载基类的成员C) 派生类不能访问基类的私有成员D) 派生类只能有一个直接基类25C#中的多态不能通过【 】实现。A) 接口B) 抽象类C) 密封类D) 虚方法26下列程序错误的原因是【 】。sealed class SealedClassclass Derived:SealedClassA) SealedClass类不能被继承B) 没有Main()入口C) SealedClass没有被实例化D) 以上皆是27下面关于接口的叙述中,不正确的是【 】。A) 接口只是由方法、属性、索引器或事件组成的框架,并没有描述任何对象的实例代码B)

11、接口的所有成员都被自动定义为公有的,不可使用访问修饰符来定义接口成员C) 类可以通过在类型定义语句中包括冒号和接口名来表明它正在实现接口D) 一个类只能实现一个接口28接口可以包含一个或多个成员,以下选项中【 】不能包含在接口中。A) 方法B) 属性C) 事件D) 常量29下列叙述中,正确的是【 】。A) 接口中可以有虚方法B) 一个类可以实现多个接口C) 接口能被实例化D) 接口中可以包含已实现的方法30. 关于虚方法实现多态,下列说法错误的是【 】。A) 定义虚方法使用关键字virtual B) 关键字virtual可以与override一起使用C) 虚方法是实现多态的一种应用形式 D)

12、派生类是实现多态的一种应用形式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接口,实现此接口代码正确的是【 】。interface IPlay void Play

14、();void Show();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 /省略部分代码

15、34. 以下泛型集合声明中正确的是【 】。A) List<int> f=new List<int>(); B) List<int> f=new List (); C) List f=new List (); D) List<int> f=new List<int> 34. 以下关于泛型的叙述中错误的是【 】。A) 泛型是通过参数化类型来实现在同一份代码上操作多种数据类型B) 泛型编程是一种编程范式,其特点是参数化类型,C) 泛型类型和普通类型的区别在于泛型类型与一组类型参数或类型变量关联D) 以上都不对二填空题1在C#中有两种多态性:

16、编译时的多态性和运行时的多态性。编译时的多态性是通过【虚方法和重写虚方法 】实现的,运行时的多态性是通过继承和【重载/隐藏 】来实现的。2在声明类时,在类名前使用【abstract】修饰符,则声明的类只能作为其他类的基类,不能被实例化。3在声明类时,在类名前使用【 sealed 】修饰符,则声明的类不能作为其他类的基类,不能再派生新的类。4. 下列程序的运行结果是【AB 】。考察类的继承(构造函数是先基类的先构造,析构函数是子类先析构)class Apublic A( )Console.WriteLine("A");class B:Apublic B()Console.Wr

17、iteLine("B");class Programpublic static void Main()B b = new B();Console.ReadLine();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 st

18、atic void Main() B b = new B(3, 6); int n = b.getx1(); int m = b.getx2(); Console.WriteLine("m=0,n=1", m, n); m=3,n=66. 分析下列程序的运行结果是【 】。考察类的继承(隐藏和重写)abstract class BaseClasspublic void MethodA() Console.WriteLine("BaseClass.MethodA"); public virtual void MethodB() Console.WriteLi

19、ne("BaseClass.MethodB"); class Class1 : BaseClass new public void MethodA() Console.WriteLine("Class1.MethodA"); public override void MethodB() Console.WriteLine("Class1.MethodB"); class Class2 : Class1 new public void MethodB() Console.WriteLine("Class2.MethodB&qu

20、ot;); class MainClass public static void Main(string args) Class2 a = new Class2(); a.MethodA(); a.MethodB(); Console.Read(); Class1.MethodAClass2.MethodB7下列程序的运行结果是【AA CC DD DD 】。考察类的继承(隐藏和重写)class A public void F1() Console.Write("AA "); public virtual void F2() Console.Write("BB &q

21、uot;); 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.F2(); Console.Read();8. 阅读下列程序,程序的输出结果是【 】。考察类的继承public class A private int speed =10; publ

22、ic 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() B b=new B(); b.Speed = 30; 非机动车禁止驶入!9. 阅读下列程序,程序的输

23、出结果是【 】。考察类的继承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("不得入内"); class Progr

24、am public static void Main() People b = new People (25); Console .WriteLine("你的年龄是:0",b.Age); Console.Read(); 成年人不得入内你的年龄是:2510. 阅读下列程序,程序的输出结果是【 】。考察接口的映射interface IA void Hello(); class Base:IA public void Hello() Console.WriteLine("Hello in Base!"); class Derived:Base new publ

25、ic void Hello() 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. 阅读下列程序,程序的输出结果是

26、【 】。考察接口的映射interface IA void 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;

27、x=b; x.Hello();x=d; x.Hello(); Console.Read();Hello in Base!Hello in Derived!12. 阅读下列程序,程序的输出结果是【 】。考察接口的映射interface Ia /接口Ia声明 double fun1(); /接口成员声明 int fun2(); /接口成员声明 class A /声明基类A public int fun2() /隐式实现接口成员fun2 return 2; class B : A, Ia /类B从基类A和接口继承 double x; public B(double y) /构造函数 x = y; p

28、ublic double fun1() /隐式实现接口成员fun1 return x; class 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. 阅读下列程序,程序的输出结果是【 】。考察类的实现与泛型class Stack<T> /声明栈泛型类 int maxsize;/栈中元素最多个数 T d

29、ata;/存放栈中T类型的元素 int top;/栈顶指针 public Stack()/构造函数 maxsize = 10; data = new Tmaxsize; top = -1; public Stack(int n)/重载构造函数 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;

30、 return true; public bool Pop(ref T e)/元素出栈方法 if (top = -1)return false; e = datatop; top-; return true; class Program static void Main(string args) int e = 0; Stack<int> s = new Stack<int>(); /定义整数栈 s.Push(1);s.Push(3); s.Push(2); Console.Write("整数栈出栈次序:"); while (!s.StackEmpt

31、y() /栈不空时出栈元素 s.Pop(ref e); Console.Write("0 ", e); Console.WriteLine(); string e1 = "" Stack<string> s1 = new Stack<string>(); /定义字符串栈 s1.Push("Mary");s1.Push("John"); s1.Push("Simth"); Console.Write("字符串栈出栈次序:"); while (!s1.St

32、ackEmpty()/栈不空时出栈元素 s1.Pop(ref e1); Console.Write("0 ", e1); Console.ReadLine(); 整数栈出栈次序:2 3 1字符串栈出栈次序:Simth John Mary三改错题(说明:下列程序中部分下划线的代码有错误,请将有错误的部分改正过来,并说明原因)1class Apublic A(int x) class B:Apublic B(int x) 答:“public B(int x) ”应改为“public B(int x):base(x) ”。因为基类A中没有无参数的构造函数。2class Avoid

33、 A() private A(int x) private A(int y) 答:“void A() ”应改为“A()”,因为构造函数不能带任何返回类型修饰符。“private A(int x) ”和“private A(int y) ”实际上是同一个构造函数,应删除其中一个。3interface Iint x;public void f(int x);void g(int x);int h(int x) return 1; class A:Ipublic void f(int x) public int h(int x) 答:“int x;”应予以删除,因为接口中不允许存在成员变量。“pub

34、lic void f(int x);”中的修饰符“public”应予以删除,因为接口的方法前不允许存在任何修饰符;“int h(int x) return 1; ” 应改为“int h(int x);”,因为不能在接口声明的函数中编写实现代码;应该在类A中添加函数“void g(int x);”的实现代码。4class A class B class C: A, B答:必须将“class C:A,B”中的“A”或“B”其中之一去掉,因为C#中不允许类进行多重继承。5class Aprotected static void f() protected void g() class B:Anew

35、public static void f() new public void g() public void h() base.f();base.g();f(); g();答:“base.f();”应改为“A.f();”,原因是类A中的方法“f()”是静态方法,它不能被实例化,只能通过类名来访问。四问答题1什么是类的继承?怎样定义派生类?继承是指一个类可以继承另一个类中的相关成员,被继承的类称为基类、超类或父类,继承而形成的类称为派生类或子类利用继承机制,新的类可以从已有的类中派生。那些用于派生的类称为这些特别派生出的类的“基类”2简述创建派生类时,构造函数的调用。先创建基类的构造函数,在创建

36、自己的构造函数3怎样定义基类虚方法,并在派生类中重写基类虚方法?virtual 方法名(参数列表) 语句序列 override 方法名(参数列表) 语句序列 4抽象方法和虚方法有什么异同?抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写;虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。 重写的子类虚函数就是被覆盖了。5什么是抽象类?它有什么特点?它和接口有何异同?v 在方法声明中使用abstract修饰符的方法即为抽象方法。6什么是方法重载?重载的方法有何特点?是多态性的表达 方法名相同,但是参数类型和个数不同五编程题1. 编写一个

37、控制台应用程序项目,实现学生和教师数据输入和显示功能。学生类Student有编号、姓名、班号和成绩等字段,教师类有编号、姓名、职称和部门等字段。要求将编号、姓名输入和显示设计成一个类Person,并作为Student和Teacher的基类。需用相关数据进行测试。 public class Person /人类 private int no; /编号 private string name; /姓名 public void input() Console.Write(" 编号:"); no = int.Parse(Console.ReadLine(); Console.Wri

38、te(" 姓名:"); 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(); Console.Write(" 班号:&quo

39、t;); 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

40、string depart; /部门 public 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);

41、 class Program static void Main(string args) Student s1 = new Student(); Teacher t1 = new Teacher(); Console.WriteLine("输入一个学生数据:"); s1.input(); Console.WriteLine("输入一个教师数据:"); t1.input(); Console.WriteLine("显示一个学生数据:"); s1.disp(); Console.WriteLine("显示一个教师数据:"

42、;); t1.disp(); 2. 设计一个控制台应用程序项目b,设计一个普通职工类Employee,其工资为基本工资(1000)加上工龄工资(每年增加30元)。从Employee类派生出一个本科生类UEmployee,其工资为普通职工算法的1.5倍。并用相关数据进行测试,测试效果图如下图所示。控制台应用程序项目b的执行结果public class Employee /普通职工类 private double bsalary= 1000; /基本工资 private double psalary; /实际工资 private int n; /工作年数 public int pn get ret

43、urn n; set n = value; public double compsalary() /计算普通员工工资 Console.Write("工作年数:"); pn = int.Parse(Console.ReadLine(); psalary = bsalary+30*pn; return psalary; public class UEmployee : Employee /本科生职工类 new public double compsalary() return 1.5 * psalary(); class Program static void Main(str

44、ing args) Console.WriteLine("普通职工:"); Employee emp1 = new Employee(); Console.WriteLine("该普通职工工资:0", psalary(); Console.WriteLine("本科生职工:"); UEmployee emp2 = new UEmployee(); Console.WriteLine("该本科生职工工资:0", psalary(); 说明:本题需采用继承方法,用虚函数等均可。3定义一个Shape抽象类,在该类中定义两

45、个抽象方法GetArea和GetPerim。然后以Shape抽象类作为基类派生出Rectangle和Circle类,在这两个类中分别对GetArea和GetPerim方法进行重写,实现求特定形状的面积和周长。抽象类方法实现public abstract class Shape public abstract double GetArea(); public abstract double GetPerim(); class Rectangle : Shape/派生出来的Rectangle类 private double Width;/矩形的宽度 private double Length; /矩形的长度 public Rectangle(double a, double b) /构造函数 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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论