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

  • 相关阅读:
    osworkflow
    用Flash做报表,推荐使用Flash饼图
    ANT 发布项目中 build.xml 文件的详细配置
    tomcat 修改java后不重启的方法
    工厂方法(Factory Method)模式
    NSRunLoop概述和原理
    使用NSOperationQueue简化多线程开发
    使用Grad Central Dispatch简化iPhone开发
    进度显示例子学习
    深入浅出 iOS 之多线程
  • 原文地址:https://www.cnblogs.com/May-day/p/6367579.html
Copyright © 2011-2022 走看看