• 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并不叫重写,而是子类新创建一个方法,只是新创建的这个方法刚好跟基类中的方法同名

  • 相关阅读:
    Silverlight 2 <vsm:Setter ...和<Setter ...的区别
    [原]获取指定日期WeekOfMonth
    [转]探求真正的SOA
    [转]SOA,现在进行时
    网络尖兵(NetSniper)专题
    老公必读44条守则
    Cisco2620路由器的配置与维护
    2007年银行业从业人员资格考试试题及参考答案
    可亲的“魅力水城”聊城
    我的650装机软件(供新手参考)
  • 原文地址:https://www.cnblogs.com/May-day/p/6367579.html
Copyright © 2020-2023  润新知