本篇文章主要介绍了详解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(); }
}
}
从上图得出的结果是:
综上:抽象类的虚方法需要被重写,那问题来了重写有两种方式,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("我是老师");
/