10.2 类成员的其他议题
下面该讨论一些比较高级的成员议题了。本节主要研究:
隐藏基类方法
调用重写或隐藏的基类方法
嵌套的类型定义
10.2.1 隐藏基类方法
当从基类继承一个(非抽象的)成员时,也就继承了其实现代码。如果继承的成虽是虚拟的,就可以用override关键字重写这段实现代码。无论继承的成员是否为虚拟,都可以隐藏这些实现代码。这是很有用的,例如,当继承的公共成员不像预期的那样工作时,就可以隐藏它。
使用下面的代码就可以隐藏:
public class MyBaseClass { public void DoSomething() { // Base implementation. } } public class MyDerivedClass : MyBaseClass { public void DoSomething() { // Derived class implementation, hides base implementation. } }
尽管这段代码正常运行,但它会产生一个警告,说明隐藏了一个基类成员。如果是无意间隐藏了一个需要使用的成员,此时就可以改正错误。如果确实要隐藏该成员,就可以使用new关键字显式地表明意图:
public class MyBaseClass { public void DoSomething() { // Base implementation. } } public class MyDerivedClass : MyBaseClass { new public void DoSomething() { // Derived class implementation, hides base implementation. } }
其工作方式是完全相同的,但不会显示警告。此时应注意隐藏基类成员和重写它们的区别。考虑下面的代码:
public class MyBaseClass { public virtual void DoSomething() { Console.WriteLine( "Base imp" ); } } public class MyDerivedClass : MyBaseClass { public override void DoSomething() { Console.WriteLine( "Derived imp" ); } }
其中重写方法将替换基类中的实现代码,这样,下面的代码就将使用新版本,即使这是通过基类类型进行的,情况也是这样(使用多态性):
MyDerivedClass myObj = new MyDerivedClass(); MyBaseClass myBaseObj; myBaseObj = myObj; myBaseObj.DoSomething();
结果如下:
Derived imp
另外,还可以使用下面的代码隐藏基类方法:
public class MyBaseClass { public virtual void DoSomething() { // 方法不必是虚拟的,但结果是一样的. Console.WriteLine( "Base imp" ); } } public class MyDerivedClass : MyBaseClass { new override void DoSomething() { Console.WriteLine( "Derived imp" ); } }
其结果如下:
Base imp // 注意,这里跟使用重写结果不一样。
尽管隐藏了基类的实现代码,但仍可以通过基类访问它。