zoukankan      html  css  js  c++  java
  • 重写基类方法与隐藏基类方法的区别

    重写基类方法与隐藏基类方法的区别

     
    其实要分析二者的区别,就是分析override和new这两个关键字在控制类的版本上的区别。
    首先,我先列出本地MSDN 2008上与此有关的一些官方资料:
    • “override(C# 参考)”:(ms-help://MS.MSDNQTR.v90.chs/dv_csref/html/dd1907a8-acf8-46d3-80b9-c2ca4febada8.htm)
    • “new 修饰符(C# 参考)”:(ms-help://MS.MSDNQTR.v90.chs/dv_csref/html/a2e20856-33b9-4620-b535-a60dbce8349b.htm)
    • “使用 Override 和 New 关键字进行版本控制(C# 编程指南)”:(ms-help://MS.MSDNQTR.v90.chs/dv_csref/html/88247d07-bd0d-49e9-a619-45ccbbfdf0c5.htm)
    • “了解何时使用 Override 和 New 关键字(C# 编程指南)”:(ms-help://MS.MSDNQTR.v90.chs/dv_csref/html/323db184-b136-46fc-8839-007886e7e8b0.htm)
    其次,我将以上资料中的一个例子进行简单修改,以更好地体现出二者在使用时的区别。
    复制代码
    using System;

    namespace KeywordsOfOverrideAndNew
    {
        
    // Define the base class
        class Car
        {
            
    public virtual void DescribeCar()
            {
                System.Console.WriteLine(
    "Call the DescribeCar() defined in Car class.");
            }
        }

        
    // Define the derived classes
        class ConvertibleCar : Car
        {
            
    // Use new
            public new virtual void DescribeCar()
            {
                System.Console.WriteLine(
    "Call the DescribeCar() defined in ConvertibleCar class.");
            }
        }
        
    class Minivan : Car
        {
            
    // Use override
            public override void DescribeCar()
            {
                System.Console.WriteLine(
    "Call the DescribeCar() defined in Minivan class.");
            }
        }

        
    class Program
        {
            
    static void Main(string[] args)
            {
                Console.WriteLine(
    "Declare object type by each classes :\n");
                Car car1 
    = new Car();
                car1.DescribeCar();
                System.Console.WriteLine(
    "----------");
                ConvertibleCar car2 
    = new ConvertibleCar();
                car2.DescribeCar();
                System.Console.WriteLine(
    "----------");
                Minivan car3 
    = new Minivan();
                car3.DescribeCar();
                System.Console.WriteLine(
    "----------");

                Console.WriteLine(
    "\n\n\n");

                Console.WriteLine(
    "Declare object type by the Car class :\n");
                Car[] cars 
    = new Car[3];
                cars[
    0= new Car();
                cars[
    1= new ConvertibleCar();
                cars[
    2= new Minivan();

                
    foreach (Car vehicle in cars)
                {
                    System.Console.WriteLine(
    "Car object: " + vehicle.GetType());
                    vehicle.DescribeCar();
                    System.Console.WriteLine(
    "----------");
                }

                Console.Read();
            }
        }
    }

    /*
    下面列出程序运行后的结果:
    Declare object type by each classes :

    Call the DescribeCar() defined in Car class.
    ----------
    Call the DescribeCar() defined in ConvertibleCar class.
    ----------
    Call the DescribeCar() defined in Minivan class.
    ----------



    Declare object type by the Car class :

    Call the DescribeCar() defined in Car class.
    ----------
    Call the DescribeCar() defined in Car class.
    ----------
    Call the DescribeCar() defined in Minivan class.
    ----------
    */
    复制代码
     
    由生成的结果我们可以看出:
    • 当使用基类和派生的类来声明对象时,各派生类对象都将执行各自的派生类方法。
    • 当使用基类通过多态来声明对象时,使用 new 来隐藏基类方法的派生类由于使用了 new 关键字来定义此方法,由该派生类所创建的对象调用的不是派生类方法,而是基类方法。而使用 override 来重写基类方法的派生类所创建的对象调用的方法是派生类方法。
    该文章经过本人整理所得,欢迎转载,转载时请加上本文地址;本文基于署名 2.5 中国大陆许可协议发布,请勿演绎或用于商业目的,但是必须保留本文的署名张志涛(包含链接如您有任何疑问或者授权方面的协商,请给我留言
  • 相关阅读:
    分布式缓存Redis
    MySQL优化
    SYSRET
    SYSCALL
    bolt cms V3.7.0 xss和远程代码执行漏洞
    github渗透测试工具库
    Gradle系列之Gradle插件
    fastjson 漏洞利用 命令执行
    linux 关闭对端口的监听
    微信小程序自动化测试最佳实践(附 Python 源码)
  • 原文地址:https://www.cnblogs.com/zhangzt/p/3080212.html
Copyright © 2011-2022 走看看