继承与多态

继承(也成为派生)的作用:能够创建新的类,这些新的类继承了父类的特征和行为。(方法和字段)

多重继承

许多面向对象允许派生类继承多个父类,这种称为多重继承。
C#中只允许单继承。

继承的操作范围

(1) 新添私有数据(字段)
(2) 新添行为(方法)
(3) 重新定义现有的行为

继承的语法

  1. public class Vehicle { }
  2. public class FourWheeledVehicle { }
  3. public class TwoWheeledVehicle : Vehicle { }
  4. public class Car : FourWheeledVehicle { }
  5. public class Truck : FourWheeledVehicle { }
  6. public class MotorCycle : TwoWheeledVehicle { }

继承的规则

派生类和基类可以互相转化,
向上型:派生类转化为基类
向下型:基类转化为派生类
其中向下型不能隐式的转化,必须显示转化;

  1. //不合法
  2. Vehicle v1 = new Vehicle();
  3. Car c = v1;
  4. //合法
  5. Vehicle v1 = new Vehicle();
  6. Car c = Carv1;
  7. Vehicle v1 = new Vehicle();
  8. Vehicle v2 = new Truck();
  9. Car c = (Car)v2;
  10. //该代码合法,但是运行会出错

基类和派生类转化判断:

  1. Truck t = new Truck();
  2. FourWheeledVehicle v1 = (FourWheeledVehicle)c;
  3. FourWheeledVehicle v2 = (FourWheeledVehicle)t;
  4. //使用C#底层类型系统判断能否将v1的类型(v1.GetType()的结果)赋给类型Car(方法调用typeof(Car)的结果), 如果答案是肯定的,就将v1显式地转换为Car。
  5. if (typeof(Car).IsAssignableFrom(v1.GetType()))
  6. {
  7. c = (Car)v1;
  8. Console.WriteLine(c.GetType());
  9. }
  10. //询问类型系统:v1是否是Car,如果是, 就将v1显式地转换为Car。
  11. if(v1 is Car)
  12. {
  13. c = (Car)v1;
  14. }
  15. //如果v1可转换为Car,就执行转换并 返回结果;否则,返回null。
  16. c = v1 as Car;
  17. if(c != null)
  18. {
  19. Console.WriteLine(c.GetType());
  20. }


处理继承来的成员

成员隐藏
隐藏基类成员可能导致意外(至少是原本不想要)的结果。虽然有时故意在派生类中隐藏基类成员,但是成员隐藏通常是这样做的结果:
对基类的修改(这可能是您能够控制的,也可能是您无法控制的)导致您无意间隐藏了基类成员。
如果想在派生类中定义与基类成员同名的成员,则可以使用new关键字把基类成员隐藏起来。
如果不适应new关键字,在派生类中定义一个与基类成员同名的成员,编译器将产生警告信息,如下代码演示:
继承与多态 - 图1

  1. public class Animals
  2. {
  3. public void Eat()
  4. {
  5. Console.WriteLine("动物吃方法");
  6. }
  7. }
  8. public class Horse1:Animals
  9. {
  10. //使用new关键字进行修饰,从而隐藏了基类中同名成员
  11. public new void Eat()
  12. {
  13. Console.WriteLine("马吃的方法");
  14. }
  1. }<br />若此时扔然想访问基类的成员,则可以使用强制类型转换,把子类强制转换成基类类型,从而访问隐藏的基类成员。