10.3 使用new修饰符隐藏基类的成员
我们在第6章学习过new运算符,这里讲的是它的另外一个用途,在这里new不再是运算符,而是修饰符。new修饰符的作用是显式地隐藏从基类继承的成员。你并非一定这样做,不用它也可以达到目的,但会引发一个编译器警告,同样地,如果你没有隐藏任何基类成员时,就不应使用new修饰符,那样也会引发一个编译器警告。
那么,如何隐藏基类的成员呢?
❑若要隐藏继承的数据成员(例如:字段),需要在派生类中声明一个相同名称的成员,并使用new修饰符修饰该成员,注意,这里只需名称相同即可,而不管类型是否相同;
❑若要隐藏继承的方法成员,需要在派生类中声明一个具有相同签名的方法,注意,签名不包括返回值,并使用new修饰符修饰该方法;
❑基类的静态成员也可以被隐藏,方法同上。
下面,我们看一个例子,如代码清单10-4所示。
代码清单10-4 隐藏基类的成员
1 using System;
2
3 namespace ProgrammingCSharp4
4{
5 class BaseClass
6{
7 public string FieldA=“我是基类”;
8 public static string StaticFieldB=“我是基类的静态字段”;
9 public void SayHi()
10{
11 Console.WriteLine(“Hi,我是基类!”);
12}
13}
14
15 class ChildClass:BaseClass
16{
17 new public int FieldA=100;
18 new public static string StaticFieldB=“我是派生类的静态字段”;
19 new public string SayHi()
20{
21 Console.WriteLine(“Hi,我是派生类!”);
22 return null;
23}
24}
25
26 class ClassExample
27{
28 public static void Main()
29{
30 ChildClass child=new ChildClass();
31 Console.WriteLine(child.FieldA);
32 Console.WriteLine(ChildClass.StaticFieldB);
33 child.SayHi();
34}
35}
36}
对代码清单10-14的说明如表10-3所示。
程序运行结果如下:
100
我是派生类的静态字段
Hi,我是派生类!
如果我们去掉代码清单10-4中第17行的new修饰符,程序仍然可以编译并能正确运行,但编译器会引发一个警告,信息如下:
"ProgrammingCSharp4.ChildClass.FieldA"隐藏了继承的成员
"Programming CSharp4.BaseClass.FieldA"如果是有意隐藏,请使用关键字new