继承与多态
继承(也成为派生)的作用:能够创建新的类,这些新的类继承了父类的特征和行为。(方法和字段)
多重继承
许多面向对象允许派生类继承多个父类,这种称为多重继承。
C#中只允许单继承。
继承的操作范围
(1) 新添私有数据(字段)
(2) 新添行为(方法)
(3) 重新定义现有的行为
继承的语法
public class Vehicle { }
public class FourWheeledVehicle { }
public class TwoWheeledVehicle : Vehicle { }
public class Car : FourWheeledVehicle { }
public class Truck : FourWheeledVehicle { }
public class MotorCycle : TwoWheeledVehicle { }
继承的规则
派生类和基类可以互相转化,
向上型:派生类转化为基类
向下型:基类转化为派生类
其中向下型不能隐式的转化,必须显示转化;
//不合法
Vehicle v1 = new Vehicle();
Car c = v1;
//合法
Vehicle v1 = new Vehicle();
Car c = (Car)v1;
Vehicle v1 = new Vehicle();
Vehicle v2 = new Truck();
Car c = (Car)v2;
//该代码合法,但是运行会出错
基类和派生类转化判断:
Truck t = new Truck();
FourWheeledVehicle v1 = (FourWheeledVehicle)c;
FourWheeledVehicle v2 = (FourWheeledVehicle)t;
//使用C#底层类型系统判断能否将v1的类型(v1.GetType()的结果)赋给类型Car(方法调用typeof(Car)的结果), 如果答案是肯定的,就将v1显式地转换为Car。
if (typeof(Car).IsAssignableFrom(v1.GetType()))
{
c = (Car)v1;
Console.WriteLine(c.GetType());
}
//询问类型系统:v1是否是Car,如果是, 就将v1显式地转换为Car。
if(v1 is Car)
{
c = (Car)v1;
}
//如果v1可转换为Car,就执行转换并 返回结果;否则,返回null。
c = v1 as Car;
if(c != null)
{
Console.WriteLine(c.GetType());
}
处理继承来的成员
成员隐藏
隐藏基类成员可能导致意外(至少是原本不想要)的结果。虽然有时故意在派生类中隐藏基类成员,但是成员隐藏通常是这样做的结果:
对基类的修改(这可能是您能够控制的,也可能是您无法控制的)导致您无意间隐藏了基类成员。
如果想在派生类中定义与基类成员同名的成员,则可以使用new关键字把基类成员隐藏起来。
如果不适应new关键字,在派生类中定义一个与基类成员同名的成员,编译器将产生警告信息,如下代码演示:
public class Animals
{
public void Eat()
{
Console.WriteLine("动物吃方法");
}
}
public class Horse1:Animals
{
//使用new关键字进行修饰,从而隐藏了基类中同名成员
public new void Eat()
{
Console.WriteLine("马吃的方法");
}
}<br />若此时扔然想访问基类的成员,则可以使用强制类型转换,把子类强制转换成基类类型,从而访问隐藏的基类成员。