• 技术文章 >后端开发 >C#.Net教程

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

    黄舟黄舟2017-03-06 11:12:05原创875
    本篇文章主要介绍了详解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并不叫重写,而是子类新创建一个方法,只是新创建的这个方法刚好跟基类中的方法同名

    以上就是详解C#用new和override来实现抽象类的重写区别的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:C#,new,override
    上一篇:C#中的let字句应用示例详解 下一篇:C#读取XML的三种实现方式的代码详解
    千万级数据并发解决方案

    相关文章推荐

    • 一文聊聊C语言中的字符串操作(大小写转换、比较、排序等)• 利用c#制作简单的留言板(2)• SUNWEN教程之----C#进阶(九)• .NET异步编程总结----四种实现模式代码总结• C# 动态加载Dll
    1/1

    PHP中文网