软件编程
位置:首页>> 软件编程>> C#编程>> 详解C#用new和override来实现抽象类的重写区别

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

作者:叶丶梓轩  发布时间:2022-12-02 01:50:51 

标签:c#,new,override

一,抽象的实现


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(); }
 }
}

从上图得出的结果是:

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

综上:抽象类的虚方法需要被重写,那问题来了重写有两种方式,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("我是老师");
   }
 }
}

结果显示为:

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

综上总结:

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

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

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

来源:http://www.cnblogs.com/May-day/p/6367579.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com