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("我是老师");
        //}
        public new void Say()
        {
            Console.WriteLine("我是老师");
        }
    }
}

 

 

结果显示为:

综上总结:

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

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

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

 

posted @ 2017-02-05 14:56  叶丶梓轩  阅读(1257)  评论(0编辑  收藏  举报