隐藏基类方法

  当从基类继承一个(非抽象的)成员时,也就继承了其实现代码。如果继承的成员是虚拟的,就可以用 override 关键字重写这段代码。无论继承的成员是否为虚拟,都可以隐藏这些实现代码。这是很有用的,例如,当继承的公共成员不像预期的那样工作时,就可以隐藏它。

使用下面的代码就可以隐藏:

  1. public class MyBaseClass
  2. {
  3. public void DoSomething()
  4. {
  5. // Base implementation.
  6. }
  7. }
  8. public class MyDerivedClass : MyBaseClass
  9. {
  10. public void DoSomething()
  11. {
  12. // Derived class implementation, hides base implementation.
  13. }
  14. }

  尽管这段代码可以正常运行,但它会长生一个警告,说明隐藏了一个基类成员。如果是无意间隐藏了一个需要使用的成员,此时就可以改正错误。如果确实要隐藏该成员,就可以使用 new 关键字显式地表明意图:

  1. public class MyDerivedClass : MyBaseClass
  2. {
  3. new public void DoSomething()
  4. {
  5. // Derived class implementation, hides base implemetation.
  6. }
  7. }

  其工作方式是完全相同的,但不会显示警告。此时应注意隐藏基类成员和重写它们的区别。考虑下面的代码:

  1. public class MyBaseClass
  2. {
  3. public virtual void DoSomething()
  4. {
  5. Console.WriteLine("Base imp");
  6. }
  7. }
  8. public class MyDerivedClass : MyBaseClass
  9. {
  10. public override void DoSomething()
  11. {
  12. Console.WriteLine("Derived imp");
  13. }
  14. }

  其中重写方法将替换基类中的实现代码,这样,下面的代码就将使用新版本,即使这是通过基类进行的,情况也同样如此(使用多态性):

  1. MyDerivedClass myObj = new MyDerivedClass();
  2. MyBaseClass myBaseObj;
  3. myBaseObj = myObj;
  4. myBaseObj.DoSomething();

  结果如下:

  1. Derived imp

  另外,还可以使用下面的代码隐藏基类方法:

  1. public class MyBaseClass
  2. {
  3. public virtual void DoSomething()
  4. {
  5. Console.WriteLine("Base imp");
  6. }
  7. }
  8. public class MyDerivedClass : MyBaseClass
  9. {
  10. new public void DoSomething()
  11. {
  12. Console.WriteLine("Derived imp");
  13. }
  14. }

  基类方法不必是虚拟的,但结果是一样的,只需修改上面代码中的一行即可。对于基类的虚拟方法和非虚拟方法而言,其结果如下:

  1. Base imp

  尽管隐藏了基类的实现代码,但仍可以通过基类访问它。