首页 > 编程 > C# > 正文

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

2020-01-24 00:46:13
字体:
来源:转载
供稿:网友

一,抽象的实现

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Virtualdemo{  class Program  {    static void Main(string[] args)    {//BClass A = new BClass(); 抽象类无法被实例      Class1 c = new Class1();      BClass c2 = c;      c2.MethodA();      c.MethodA();      c2.MethodB();      c.MethodB();      c2.MethodC();      c.MethodC();      Console.ReadKey();    }  }  abstract class BClass  //抽象类无法被实例  {    public virtual void MethodA() { Console.WriteLine("BClassA"); }    public virtual void MethodB() { Console.WriteLine("BClassB"); }    public virtual void MethodC() { Console.WriteLine("BClassC"); }  }  class Class1 : BClass  {    public void MethodA() { Console.WriteLine("MethodA"); }//如果一个虚函数 在子类中没有通过override关键字,那么这个方法就没有被重写,而是被隐藏了    public override void MethodB() { Console.WriteLine("MethodB"); }    public override void MethodC() { base.MethodC(); }  }}

从上图得出的结果是:

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

二,new和override重写的区别:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Virtualdemo{  class Program  {    static void Main(string[] args)    {      Teacher t = new Teacher();      Student stu = t;      stu.Exam();      stu.Say();      t.Say();      Console.ReadKey();    }  }  public abstract class Student  {    public virtual void Exam()    {      Console.WriteLine("学生都要考试");    }    public void Say()    {      Console.WriteLine("我是学生");    }  }  public class Teacher : Student  {    public override void Exam()    {      Console.WriteLine("老师不用考试");    }    //public override void Say() //报错,提示没有virtual,无法被重写    //{    //  Console.WriteLine("我是老师");    //}    public new void Say()    {      Console.WriteLine("我是老师");    }  }}

结果显示为:

综上总结:

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表