C#多态机制的具体实现(附带实例)
多态是面向对象编程的基本特征之一,它使得派生类的实例可以直接赋予基类的对象,然后就可以通过这个对象调用派生类的方法。
在 C# 中,类的多态性是通过在派生类中重写基类的虚方法来实现的。
C# 中方法在默认情况下不是虚拟的,但(除构造函数外)可以显式地声明为 virtual,在方法前面加上关键字 virtual,则称该方法为虚方法。
例如,以下代码声明了一个虚方法:
定义为虚方法后,可以在派生类中重写虚方法,重写虚方法使用 override 关键字,这样在调用方法时,可以调用对象类型的合适方法。
例如,使用 override 关键字重写上面的虚方法:
注意,类中的成员字段和静态方法不能声明为 virtual,因为 virtual 只对类中的实例方法和属性有意义。
【实例】创建一个控制台应用程序,首先自定义一个 Vehicle 类,用来作为基类,该类中自定义一个虚方法 Move;然后自定义 Train 类和 Car 类,都继承自 Vehicle 类,在这两个派生类中重写基类中的虚方法 Move,输出不同交通工具的形态;最后,在 Pragram 类的 Main 方法中,分别使用基类和派生类的对象生成一个 Vehicle 类型的数组,使用数组中的每个对象调用 Move 方法,比较它们的输出信息。代码如下:
程序运行结果为:
在 C# 中,类的多态性是通过在派生类中重写基类的虚方法来实现的。
C# 中方法在默认情况下不是虚拟的,但(除构造函数外)可以显式地声明为 virtual,在方法前面加上关键字 virtual,则称该方法为虚方法。
例如,以下代码声明了一个虚方法:
public virtual void Move() { Console.WriteLine("交通工具都可以移动"); }
定义为虚方法后,可以在派生类中重写虚方法,重写虚方法使用 override 关键字,这样在调用方法时,可以调用对象类型的合适方法。
例如,使用 override 关键字重写上面的虚方法:
public override void Move() { Console.WriteLine("火车都可以移动"); }
注意,类中的成员字段和静态方法不能声明为 virtual,因为 virtual 只对类中的实例方法和属性有意义。
【实例】创建一个控制台应用程序,首先自定义一个 Vehicle 类,用来作为基类,该类中自定义一个虚方法 Move;然后自定义 Train 类和 Car 类,都继承自 Vehicle 类,在这两个派生类中重写基类中的虚方法 Move,输出不同交通工具的形态;最后,在 Pragram 类的 Main 方法中,分别使用基类和派生类的对象生成一个 Vehicle 类型的数组,使用数组中的每个对象调用 Move 方法,比较它们的输出信息。代码如下:
class Vehicle { string name; //定义字段 public string Name //定义属性为字段赋值 { get { return name; } set { name = value; } } public virtual void Move() //定义方法输出交通工具的形态 { Console.WriteLine("{0}都可以移动", Name); } } class Train : Vehicle //继承Vehicle类 { public override void Move() //重写方法输出交通工具的形态 { Console.WriteLine("{0}在铁轨上行驶", Name); } } class Car : Vehicle //继承Vehicle类 { public override void Move() //重写方法输出交通工具的形态 { Console.WriteLine("{0}在公路上行驶", Name); } } class Program { static void Main(string[] args) { Vehicle vehicle = new Vehicle(); //创建Vehicle类的实例 Train train = new Train(); //创建Train类的实例 Car car = new Car(); //创建Car类的实例 //使用基类和派生类对象创建Vehicle类型数组 Vehicle[] vehicles = { vehicle, train, car }; vehicle.Name = "交通工具"; //设置交通工具的名字 train.Name = "火车"; //设置交通工具的名字 car.Name = "汽车"; //设置交通工具的名字 vehicles[0].Move(); //输出交通工具的形态 vehicles[1].Move(); //输出交通工具的形态 vehicles[2].Move(); //输出交通工具的形态 Console.ReadLine(); } }程序中,第 39 行代码自定义一个 Vehicle 类型的数组,该数组中的元素类型不同,但是都可以向上转换为父类对象。向上转换时,即可将子类对象向上转换为父类对象,例如,可以说火车是交通工具,但不能说交通工具是火车。
程序运行结果为:
交通工具都可以移动
火车在铁轨上行驶
汽车在公路上行驶