zoukankan      html  css  js  c++  java
  • C#中的new修饰符说明

    new修饰符主要是用来隐藏从基类继承的成员. 这句话怎么理解呢,就是说有一个类,它有一个继承类,继承类中存在和基类中一样名称的成员(属性,方法等). 对继承类中的该成员使用new修饰符时,调用时将会隐藏其基类中的该成员

    举个例子如下:

    public class BaseC
    {
         public int x;
         public void MyTest() {}
    }
    
    
    public class DerivedC : BaseC
    {
          public new void MyTest() {}
    }

    类DerivedC继承类BaseC,在继承类中有一个和基类中同名的方法MyTest(), 使用new修饰符隐藏了基类的MyTest()方法。基类BaseC的字段x不受影响,因为没有使用类似名称将其隐藏.

    另外,对同一个成员同时使用new和override是错误的做法,因为这两个修饰符的含义互斥。

    new修饰符和override修饰符的区别

    new修饰符 --- 以同样的名称创建一个新成员并使原始成员变为隐藏

    override修饰符 --- 扩展继承成员的实现

    再举一个例子:

    public class BaseC
    {
       public static int x = 45;
       public static int y  =15;
    
    }
    
    public class DerivedC : BaseC
    {
       
        //Hide field 'x'
       new public static int x = 75;
    
       static void Main()
       {
           //display the new value of x
           Console.WriteLine(x);
    
          
          // display the hidden value of x
           Console.WriteLine(BaseC.x);
    
        
          //display the unhidden member y
           Console.WriteLine(y);
          
       } 
     }
    
    /*
    output:
    75
    45
    15
    */

     下面再举一个嵌套类的例子

    public class MyBaseClass
    {
       
         public class MyNestedClass
         {
                public int x = 2000;
                public int y;
    
           
          }
       
    }
    
    public class MyDerivedClass : MyBaseClass
    {
           //Nested type hiding the base type members
           new public class MyNestedClass
           {
                public int x = 1000;
                public int y;
                public int z;
    
           
           }
          
         static void Main()
        {
           //creating an object from the overlapping class
           MyNestedClass myClass1 = new   MyNestedClass ();
    
           //Creating an object from the hidden class
           MyBaseClass.MyNestedClass   myClass2 = new  MyBaseClass.MyNestedClass()
    
            Console.WriteLine(myClass1.x);
            Console.WriteLine(myClass2.x);
    
    
        }
    }
    
    /* Output
    1000
    2000
    */

    如果在继承类MyDerivedClass的嵌套类MyNestedClass中移除new修饰符,程序一样会编译和运行,但你将会收到以下警告

    The keyword new is required on 'MyDerivedClass.x' because it hides inherited member 'MyBaseClass.x'.

     

  • 相关阅读:
    监听键盘弹出 隐藏
    状态栏 设置白色字体
    UITextField 属性详解
    支付宝集成SDK 报错
    UIWebView
    app上传 需要的icon
    百度云推送 pem
    百度地图
    info.plist 属性讲解
    静态库 动态库
  • 原文地址:https://www.cnblogs.com/wphl-27/p/9242015.html
Copyright © 2011-2022 走看看