• C#中隐藏(new)和方法重写(override)和重载(overload)的区别


    重载:同一作用域内,同名同参方法,但是返回值不可能构成重载。

    重写:继承过程中,子类重写父类方法,父子类方法相同。基类方法声明为virtual(虚方法),派生类中使用override申明此方法的重写. 

    隐藏:基类方法不做申明(默认为非虚方法),在派生类中使用new声明此方法的隐藏。 

    重载时,根据参数选择调用的方法;
    重写时,访问父类子类皆调用子类的重写方法;

    隐藏时,访问父类则调用父类的方法,子类子类的方法。

     隐藏示例:

     1 using System;  
     2    class A  
     3    {  
     4          public void F()    
     5          {  
     6                Console.WriteLine("A.F");    
     7          }  
     8    }  
     9    class B:A  
    10    {  
    11          new public void F()    
    12          {    
    13                Console.WriteLine("B.F");    
    14          }  
    15    }  
    16    class Test  
    17    {  
    18          static void Main(string[] args)
    19          {  
    20                B    b    =    new    B();  
    21                b.F();  
    22                A    a    =    b;    
    23                a.F();  
    24          }  

    25    }

     输出为  
       B.F  

       A.F  

     重写virtual(虚方法)示例 

     using System;  
       
    class  A  
       {  
             
    public virtual void F()    
             {  
                   Console.WriteLine(
    "A.F");    
             }  
       }  
       
    class  B: A  
       {  
             
    public  override  void F()    
             {    
                   Console.WriteLine(
    "B.F");    
             }  
       }  
       
    class Test  
       {  
             
    static  void  Main()    
             {  
                   B    b    
    =    new    B();  
                   b.F();  
                   A    a    
    =    b;    
                   a.F();  
             }  

       }   

      输出为  
       B.F  
       B.F

     补充:重写override一般用于接口实现和继承类的方法改写,要注意

       1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
       2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
       3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
       4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。

  • 相关阅读:
    I.MX6 简单电路模拟USB设备的插入
    I.MX6 查看baudrate确定是否被其他程序占用
    I.MX6 Ethernet MAC (ENET) MAC Address hacking
    I.MX6 MAC Address 导致的系统崩溃
    I.MX6 U-boot编译找不到用户目录
    I.MX6 i2c_data_write_byte ioctl error: I/O error
    I.MX6 Android shutdown shell command
    Where Are You Standing?
    byte[]和InputStream的相互转换
    jsp 获取cookie 的值的方法
  • 原文地址:https://www.cnblogs.com/chenqingwei/p/1967644.html
Copyright © 2020-2023  润新知