1. 重写
父类的方法、属性等可以被继承,也可以被重写;但在父类中要用关键字 virtual,子类中用关键字 override。
using System;
namespace ClassLearning
{
class Program
{
static void Main(string[] args)
{
// 父类变量引用子类实例,即为多态
Vehicle vehicle = new Car();
// 会调用继承链上第一个Run()。
vehicle.Run();
}
}
class Vehicle
{
public virtual void Run()
{
Console.WriteLine("I'm running!");
}
}
class Car:Vehicle
{
public override void Run()
{
Console.WriteLine("Lincoln is running!");
}
}
}
2. 隐藏
当缺少关键字 virtual 和 override 时,即子类把父类隐藏了。
using System;
namespace ClassLearning
{
class Program
{
static void Main(string[] args)
{
// 父类变量引用子类实例,即为多态
Vehicle vehicle = new Car();
// 会调用继承链上第一个Run()。
vehicle.Run();
}
}
class Vehicle
{
public void Run()
{
Console.WriteLine("I'm running!");
}
}
class Car:Vehicle
{
public void Run()
{
Console.WriteLine("Lincoln is running!");
}
}
}
在上述代码中,子类 Car中相当于有两个 Run() 方法,一个继承于父类 Vehicle,一个是自己的,那么在执行 vehicle.Run(); 这条语句时,则会在继承链上寻找 Run() 方法,第一个即为父类的 Run() 方法, 则结果为 “I'm running!”。
但当重写时,则子类 Car中只有一个 Run() 方法,执行 vehicle.Run()时,则会调用 Car 实例对象中的 Run() 方法。
在实际开发中,要避免隐藏。
3. 多态
父类变量引用子类的实例,即为多态;多态也是基于重写。