首页 > 编程笔记 > C#笔记 阅读:10

C#多态机制的具体实现(附带实例)

多态是面向对象编程的基本特征之一,它使得派生类的实例可以直接赋予基类的对象,然后就可以通过这个对象调用派生类的方法。

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 类型的数组,该数组中的元素类型不同,但是都可以向上转换为父类对象。向上转换时,即可将子类对象向上转换为父类对象,例如,可以说火车是交通工具,但不能说交通工具是火车。

程序运行结果为:

交通工具都可以移动
火车在铁轨上行驶
汽车在公路上行驶

相关文章