C#中关于继承、接口、抽象类的练习

C#面向对象编程-练习题

1.C#中的方法重写使用关键字(a)。

  1. override
  2. overload
  3. static
  4. Inherit

2.以下的C#代码,试图用来定义一个接口:

public interface IFile{

    int A;

    int delFile()  {

        A = 3;

    }

    void disFile();

}

关于以上的代码,以下描述错误的是(d)。(选择一项)

  1. 以上的代码中存在的错误包括:不能在接口中定义变量,所以int A代码行将出现错误
  2. 以上的代码中存在的错误包括:接口方法delFile是不允许实现的,所以不能编写具体的实现函数
  3. 代码void disFile();定义无错误,接口可以没有返回值
  4. 代码void disFile();应该编写为void disFile(){}; //接口中不能去实现函数

3.在C#中,接口与抽象基类的区别在于(a)。

  1. 抽象基类可以包含非抽象方法,而接口只能包含抽象方法
  2. 抽象基类可以被实例化,而接口不能被实例化
  3. 抽象基类不能被实例化,而接口可以被实例化
  4. 抽象基类就是接口,它们之间无差别

4.在开发某图书馆的图书信息管理系统的过程中,开始为教材类图书建立一个TextBook类;现在又增加了杂志类图书,于是需要改变设计,则下面最好的设计应该是(c)。

  1. 建立一个新的杂志类Journal。
  2. 建立一个新的杂志类Journal,并继承TextBook类。
  3. 建立一个基类Book和一个新的杂志类Journal,并让Journal类和TextBoook类都继承于Book类。
  4. 不建立任何类,把杂志图书的某些特殊属性加到TextBoook类中。

5.可以使用(a)关键字重写方法。

  1. Override
  2. New

6.以下叙述正确的是:(bc)

      A.接口中可以有虚方法。         B.一个类可以实现多个接口。

      C.接口不能被实例化。           D.接口中可以包含已实现的方法。

注意:虚方法就是可能要被重写的方法,他也是一个普通的方法,拥有方法体,因此a错误。

7.下列代码输出为( b):

class Father{

   public void F() { Console.WriteLine("A.F"); }

   public virtual void G() { Console.WriteLine("A.G"); }

}

class Son: Father{

   new public void F() { Console.WriteLine("B.F"); }//隐藏了父类中的方法,父类中的F方法还存在

   public override void G() { Console.WriteLine("B.G"); }//重写了父类中的方法,父类中的G方法就不存在了

}

class override_new{

   static void Main() {

      Son b = new Son();

      Father a = b;

      a.F();//通过父类声明的对象 调用隐藏方法,会调用父类中的  A.F

      b.F();//通过子类声明的对象 调用隐藏方法,会调用子类中的  B.F

      a.G();// B.G

      b.G();//B.G

   }

}

  1.   A.F    B.F    A.G   B.G
  2.   A.F    B.F    B.G   B.G
  3.   A.F    A.F    B.G   B.G
  4.   B.F    B.F    B.G   B.G

分析:考察C#中对于方法进行重写的2中方法打的区别。隐藏方法和虚方法的区别是,当用父类声明对象,而用子类去构造对象的时候,虚方法调用的是子类中重写的方法,隐藏方法调用的则是父类中的方法。

8.写出程序的输出结果:

    public class A

    {

        public virtual void Fun1(int i)

        {

            Console.WriteLine(i);

        }

        public void Fun2(A a)

        {

            a.Fun1(1);

            Fun1(5);

        }

    }

    public class B:A    {

        public override void Fun1(int i)

        {

            base.Fun1(i+1);

        }

        public static void Main()       {

            B b=new B();

            A a=new A();

            a.Fun2(b);//b.Fun1(1) a.Fun1(5) //2  5

            b.Fun2(a);//a.Fun1(1) b.Fun1(5)// 1   6

        }

}

答案:2 5 1 6

9.在C#中,允许多接口继承,从多个接口时,使用“:”后跟继承的接口的名字,多个接口名称之间使用(c)符号进行分割。(选择一项)

 a)”.’

b)”->”

c)”,”

d)”::”

10.阅读以下的C#代码:

class A

    {

        public virtual void printStr(string str)

        {

            Console.WriteLine(str);

        }

    }

    class B:A

    {

        public override void printStr(string str)

        {

            str=str+" 重写的方法";

            Console.WriteLine(str);

        }

    }

    class DefaultInitializerApp

    {

        public static void Main()

        {

            B b=new B();

            A a=b;

            a.printStr("打印");

            b.printStr("打印");

            Console.ReadLine();

        }

    }

运行程序后将在控制台窗口打印( a )。(选择一项)

  1. 打印 重写的方法 打印 重写的方法
  2. 打印    打印 重写的方法
  3. 打印
  4. 程序有误,不能运行

11.在C#的语法中,(a)关键字可以实现在派生类中对基类的虚函数进行重载(选一项)

  1. override
  2. new
  3. static
  4. virtual

12.请问,此程序输出结果是()

abstract class BaseClass{
public virtual void MethodA(){Console.WriteLine("BaseClass");}
public virtual void MethodB(){}
}
class Class1: BaseClass{

public void MethodA(){Console.WriteLine("Class1");}
public override void MethodB(){}
}
class Class2: Class1{
new public void MethodB(){}
}
class MainClass{
public static void Main(string[] args){Class2 o = new Class2();o.MethodA(); }
}

A. BaseClass
B. BassClass Class1
C. Class1
D. Class1 BassClass

13.请问,此程序输出结果是(a)

public abstract class A { public A() { Console.WriteLine('A'); }
public virtual void Fun() { Console.WriteLine("A.Fun()"); } }
public class B: A { public B() { Console.WriteLine('B'); }
public new void Fun() { Console.WriteLine("B.Fun()"); }
public static void Main() { A a = new B();a.Fun(); } }

A. A B A.Fun()
   B. A B B.Fun()
   C. B A A.Fun()
   D. B A B.Fun()

注意:在构造B的时候,会有一个构造函数的调用。先调用父类的构造函数,再调用子类的构造函数。

14.以下叙述正确的是(bc):
A. 接口中可以有虚方法。   

B. 一个类可以实现多个接口。
C. 接口不能被实例化。      

D. 接口中可以包含已实现的方法。

15.以下关于C#代码的说法正确的是(a)。(选择一项)

Public abstract class ’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’

’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘Animal

{

    Public abstract void Eat();

    Public void Sleep()

{

}

}

  1. 该段代码正确
  2. 代码错误,因为类中存在非抽象方法
  3. 代码错误,因为类中的方法没有实现
  4. 通过代码“Animal an = new Animal();”可以创建一个Animal对象

解析:,第四个错的原因在于抽象类不能被实例化。

16.在c#中,关于继承和接口,以下说法正确的是(b) (单选)

a. c#允许许多接口实现,也允许多重继承

b.c#允许多接口实现,但不允许多重继承

c.c#不允许多接口实现,但允许多重继承

d.c#不允许多重接口实现,也不允许多重继承

17. 在C#中,已知下列代码的运行结果是“老虎吃动物”,请问在空白处1和空白处2

分别应该填写的代码是(c)

    Public class Animal

    {

        Public 空白处1 void Eat()

        {

            Consone.WriteLine(“我要吃”);

}

}

Public class Tiger:Animal

    {

        Public 空白处2 void Eat()

        {

            Consone.WriteLine(“老虎吃动物”);

}

Public calssTest

{

    Static void Main()

    {

        Animal an = new Tiger();

        an.Eat;

}

}

}

  1. Virtual , new
  2. override , virtual
  3. virtual , override
  4. new , virtual

18. 在C#中,下列关于抽象类和接口的说法,正确的是(b)(选择一项)

    a) 在抽象类中,所有的方法都是抽象方法

    b) 继承自抽象类的子类必须实现起父类(抽象类)中的所以抽象方法

    c) 在接口中,可以有方法实现,在抽象类中不能有方法实现

    d) 一个类可以从多个接口继承,也可以从多个抽象类继承

注意:抽象类虽然比较特殊,但是也是个类,因此d错误。

19. 关于以下C#代码的说法正确的是(b)

Public abstract class Animal{

    Public abstract void Eat();

}

Public class Tiger:Animal{

    Public override void Eat(){

    Console.WriteLine(“老虎吃动物”);

}

}

Public class Tigress:Tiger{

    Static void Main(){

        Tigress tiger=new Tigress();

tiger.Eat();

}

}

  1. 代码正确,但没有输出
  2. 代码正确,并且输出为”老虎吃动物”;
  3. 代码错误,因为Tigress类没有实现抽象基类Animal中的抽象方法
  4. 代码错误,因为抽象基类Animal的Eat方法没有实现

20. 在c#中 某程序员定义了一个IDataBase接口,以及实现该接口的类CDataBase ,下列关于该段代码说法正确的是(d)(选择一项)

public interface IDataBase 

    {

        void OpenTable(string tableName);

        void UpdataTable(string tableName);

    }

    public class CDataBase:IDataBase

    {

        public void OpenTable(string tableName)

        {

            Console.WriteLine("打开数据表");

        }

        public void UpdataTable(string tableName)

        {

            Console.WriteLine("更新数据表");

        }

        static void Main()

        {

            CDataBase db = new CDataBase();

            db.OpenTable("Customers");

        }

    }

a)该段代码错误,因为在定义接口时,接口中的方法没有提供实现

b)该段代码错误,因为接口中声明的方法不是公有的,应此在CDataBase类中不能访问接口中的方法

c)该段代码正确,同时由于客户没有调用UpdataTable方法,可以把CDataTable类中的UpdataTable去掉,代码仍然正确

d)该段代码正确,但是如果在IDataBase 接口中声明一个方法void Execute(string sql); 则必须在CDataBase中实现该方法

注意:接口中的方法是不需要特地声明为public的,因为默认接口中的方法就算公开的。所以b错误。c中,虽然客户没有调用该方法,可是由于他继承自接口,所以接口中的所有方法是必须实现的,因此不能删除,故d错误。

21.c#中  下列代码运行结果是(a)(选择一项)

public class Student{

        public virtual void Exam(){

            Console.WriteLine("学生都要考试");

        }

}

public class Undergraduate:Student{

        public new void Exam(){

            base.Exam();

            Console.WriteLine("大学生有选择考试科目的权利");

        }

}

public class Test{

        static void Main() {

        Student stu = new Undergraduate();

        stu.Exam();

    }

}

a)学生都要考试

b)大学生有选择考试科目的权利

c)大学生都要考试

  大学生有选择考试科目的权利

d)学生都要考试

学生都要考试

22.c#中 下列代码的运行结果是(a)(选择一项)

struct Student{

  public int age;

  public string name;

  public Student(int age,string name){

      this.age=age;

      this.name=name;

  }

}

public class Test{

  static void Mian(){

      Student stu1= new Student(18,"小方");

      Student stu2= new Student(24,"小刚");

      stu2=stu1;//在c#中 结构体是值类型,在这里赋值只会赋值其中变量的值

      stu1.age=30;

      stu1.name="小燕";

      Console.WriteLine(stu2.age);

      Console.WriteLine(st2.name);

  }

}

a)18 小方

b)18 小燕

c)30 小燕

d)30 小方

注意:结构体和类的区别。如图定义的是一个结构体,因此他是属于值类型的。值类型就意味着,当stu2=stu1执行时,传递的是内容,不像类一样,传递的是引用。因此,此时stu2中的内容被替换成了stu1中的内容,在后面的代码中,进行的是stu1的操作,对stu2没有任何影响,因此此题选择a。

23.在C#中,下列(a)关键字用于重写基类的虚拟方法。(选择一项)

a)override

b)new

c)base

d)virtual

猜你喜欢

转载自blog.csdn.net/qq_51196701/article/details/122991601