一聚教程网:一个值得你收藏的教程网站

热门教程

详解C#用new和override来实现抽象类的重写区别

时间:2022-06-25 07:53:49 编辑:袖梨 来源:一聚教程网

一,抽象的实现

 代码如下复制代码

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

 

namespaceVirtualdemo

{

  classProgram

  {

    staticvoidMain(string[] args)

    {//BClass A = new BClass(); 抽象类无法被实例

      Class1 c =newClass1();

      BClass c2 = c;

      c2.MethodA();

      c.MethodA();

      c2.MethodB();

      c.MethodB();

      c2.MethodC();

      c.MethodC();

      Console.ReadKey();

    }

  }

  abstractclassBClass //抽象类无法被实例

  {

    publicvirtualvoidMethodA() { Console.WriteLine("BClassA"); }

    publicvirtualvoidMethodB() { Console.WriteLine("BClassB"); }

    publicvirtualvoidMethodC() { Console.WriteLine("BClassC"); }

  }

  classClass1 : BClass

  {

    publicvoidMethodA() { Console.WriteLine("MethodA"); }//如果一个虚函数 在子类中没有通过override关键字,那么这个方法就没有被重写,而是被隐藏了

    publicoverridevoidMethodB() { Console.WriteLine("MethodB"); }

    publicoverridevoidMethodC() {base.MethodC(); }

  }

}

从上图得出的结果是:

综上:抽象类的虚方法需要被重写,那问题来了重写有两种方式,new和override又有什么区别

二,new和override重写的区别:

 代码如下复制代码

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

 

namespaceVirtualdemo

{

  classProgram

  {

    staticvoidMain(string[] args)

    {

      Teacher t =newTeacher();

      Student stu = t;

      stu.Exam();

      stu.Say();

      t.Say();

      Console.ReadKey();

    }

  }

  publicabstractclassStudent

  {

    publicvirtualvoidExam()

    {

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

    }

    publicvoidSay()

    {

      Console.WriteLine("我是学生");

    }

  }

  publicclassTeacher : Student

  {

    publicoverridevoidExam()

    {

      Console.WriteLine("老师不用考试");

    }

    //public override void Say() //报错,提示没有virtual,无法被重写

    //{

    //  Console.WriteLine("我是老师");

    //}

    publicnewvoidSay()

    {

      Console.WriteLine("我是老师");

    }

  }

}

结果显示为:

综上总结:

1、如果基类没有定义虚方法,那子类只能使用new,而不能使用override

2、基类有没有定义虚方法,子类都可以使用new

3、子类使用new并不叫重写,而是子类新创建一个方法,只是新创建的这个方法刚好跟基类中的方法同名

热门栏目