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所示。

10.3 使用new修饰符隐藏基类的成员 - 图1

程序运行结果如下:


100

我是派生类的静态字段

Hi,我是派生类!


如果我们去掉代码清单10-4中第17行的new修饰符,程序仍然可以编译并能正确运行,但编译器会引发一个警告,信息如下:


"ProgrammingCSharp4.ChildClass.FieldA"隐藏了继承的成员

"Programming CSharp4.BaseClass.FieldA"如果是有意隐藏,请使用关键字new