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'.