首页 > 编程笔记 > C#笔记

C#虚方法实现多态

在 C# 中,定义方法时前面加上关键字 virtual,则称该方法为虚方法。

虚方法是实现多态常用的一种方式。定义虚方法之后,就可以在子类中对虚方法进行重写,从而使程序变得灵活,程序能够在运行时确定要调用的是虚方法的哪种实现。

例如,下面代码声明了一个虚方法:
public virtual void Move()
{
     Console.WriteLine("交通工具都可以移动");
}
virtual 关键字不能与 static、abstract 或者 override 同时使用,也就是类中的静态成员、抽象成员或者重写成员不能定义为 virtual,因为 virtual 只对类中的实例方法和实现属性有意义。

定义为虚方法后,可以在子类中重写虚方法。重写虚方法时需要使用 override 关键字。这样在调用方法时,可以根据对象类型调用合适的方法。例如,使用 override 关键字重写上面的虚方法,代码如下:
public override void Move(string name)
{
     Console.WriteLine(name+"都可以移动");
}
虚方法必须有实现体,而且在子类中,可以对其进行重写,也可以不重写。它跟后面将会讲到的抽象方法不同,抽象方法没有实现体,而且必须在子类中重写。

【实例】创建一个控制台应用程序,其中自定义一个 Computer 类,用来作为父类,在该类中自定义一个虚方法 Oper;然后自定义 Pad 类和 Phone 类,都继承自 Computer 类,在这两个子类中重写父类中的虚方法 Oper,分别输出平板电脑和手机单击触摸屏时的操作;最后在 Program 类的 Main 方法中,分别使用父类和子类的对象生成一个 Computer 类型的数组,使用数组中的每个对象调用 Oper 方法,比较它们的输出信息。代码如下。
class Computer
{
      string name;//定义字段
      public string Name//定义属性为字段赋值
      {
            get { return name; }
            set { name = value; }
      }
      public virtual void Oper()//定义方法输出计算机的单击操作
      {
            Console.WriteLine("计算机能够执行单击操作");
      }
}
class Pad : Computer
{
      public override void Oper()//重写方法输出平板电脑的单击操作
      {
            Console.WriteLine("{0} 单击触摸屏可以打开图片", Name);
      }
}
class Phone : Computer
{
      public override void Oper()//重写方法输出手机的单击操作
      {
            Console.WriteLine("{0} 单击触摸屏可以拨打电话", Name);
      }
}
class Program
{
      static void Main(string[] args)
      {
            Computer computer = new Computer();//创建Computer类的实例
            Pad pad = new Pad();//创建Pad类的实例
            Phone phone = new Phone();//创建Phone类的实例
            //使用父类和子类对象创建Computer类型的数组
            Computer[] computers = { computer, pad, phone };
            pad.Name = "平板电脑";//设置平板电脑的名字
            phone.Name = "手机";//设置手机的名字
            for (int i = 0; i < computers.Length; i++)
                 //根据子类对象,调用Oper方法执行不同的操作
                 computers[i].Oper();
            Console.ReadLine();
      }
}
上面代码中定义了一个 Computer 类型的数组。该数组中的元素类型不同,但是都可以向上转型为父类对象。向上转型即将子类对象转换为父类对象。

程序运行结果为:

计算机能够执行单击操作
平板电脑 单击触摸屏可以打开图片
手机 单击触摸屏可以拨打电话

推荐阅读