1.重写
如下面的Run方法,在Car中被重写。
namespace TestClass { class Program { static void Main(string[] args) { Car car = new Car("初始车"); Console.ReadKey(); } } /// <summary> /// 交通工具类 /// </summary> class Vehicle { public string Owner { get; set; } /// <summary> /// 有参数的构造函数,注意,此时Vehicle这个类就不会再默认创建无参数的构造函数了。 /// </summary> /// <param name="owner"></param> public Vehicle(string owner) { Owner = owner; } /// <summary> /// 这个方法被重写的前提是加vitrual关键字 /// </summary> public virtual void Run() { Console.WriteLine("Vehicle is running"); } } class Car : Vehicle { /// <summary> /// 汽车类构造函数 /// </summary> /// <param name="owner"></param> public Car(string owner):base(owner) { } public override void Run() { Console.WriteLine("Vehicle is running"); } } }
2.多态
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。换句话说,实际上就是同一个类型的实例调用“相同”的方法,产生的结果是不同的。这里的“相同”打上双引号是因为这里的相同的方法仅仅是看上去相同的方法,实际上它们调用的方法是不同的。
也可以这样理解:多态是基于重写机制,函数成员的具体行为(版本)是由对象决定的。
看下面的代码实现了多态:
class Program { static void Main(string[] args) { Vehicle raceCar = new RaceCar(); Vehicle car = new Car(); Vehicle vehicle = new Vehicle(); RaceCar race = new RaceCar(); raceCar.Run(); car.Run(); vehicle.Run(); race.Run(); Console.ReadKey(); } } /// <summary> /// 交通工具类 /// </summary> class Vehicle { /// <summary> /// 这个方法被重写的前提是加vitrual关键字 /// </summary> public virtual void Run() { Console.WriteLine("Vehicle is running"); } } class Car : Vehicle { public override void Run() { Console.WriteLine("Car is running"); } } class RaceCar : Car { /// <summary> /// 使用new关键字后,使得Run方法与父类中的Run方法成为毫不相关的两个方法,只是名字相同而已。 /// </summary> public new void Run() { Console.WriteLine("RaceCar is running"); } }
结果:
Car is running Car is running Vehicle is running RaceCar is running
其中下面这2行代码输出结果是:Car is running。
因为对象raceCar引用了RaceCar的实例,对象是Vehicle类的,是顺着继承链往下找Run方法,结果发现这个方法最新的重写是在Car类中,所以实际上输出的是Car中的数据。
Vehicle raceCar = new RaceCar();
raceCar.Run();