通过继承实现的不同对象调用相同的方法,表现出不同的行为,成为多态。C#中的每种类型都是多态的。当派生类从基类继承时,它会获得基类所有方法、字段、属性和事件。面向对象的语言适用虚方法表达多态。
多态是面向对象程序设计的基本特征之一,它使得派生类的实例可以直接赋予基类的对象,然后直接通过这个对象调用派生类的方法。在C#中,类的多态性是通过在派生类中重写基类的虚方法实现的。
在C#中,方法在默认情况下不是虚拟的,但(除构造函数外)可以显式地声明为virtual,在方法前面加上virtual关键字,则称该方法为虚方法。将方法定义为虚方法后,可以在派生类中重写虚方法。重写虚方法需要使用override关键字,这样在调用方法时,可以调用对象类型的相应方法。
备注:类中的成员字段和静态方法不能声明为virtual,因为virtual只对类中的实例函数和属性有意义。
注意点:
- class MyBaseClass//基类
- {
- virtual public void Print()
- }
- class MyDerivedClass:MyBaseClass//派生类
- {
- override public void Print()
- }
- //---------------------------------------override和public的位置可以互换
- public virtual void Test()
- {
- Console.WriteLine("虚方法");
- }
- public override void Test()
- {
- Console.WriteLine("虚方法重写");
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
-
- namespace _20220806_1
- {
- public class Rectangle
- {
- protected double a, b;
- public Rectangle()
- {
- }
- public Rectangle(double a,double b)
- {
- this.a = a;
- this.b = b;
- }
- public virtual double Area()
- {
- return a * b;
- }
- }
- public class Cylinder:Rectangle
- {
- public Cylinder(double h,double r):base(h,r)
- {
- }
- public override double Area()
- {
- //return base.Area();
- return 2 * Math.PI * b * b + 2 * Math.PI * a * b;
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Rectangle r = new Rectangle(1, 10);
- Cylinder c = new Cylinder(4, 2);
- Console.WriteLine("矩形面积:{0}", r.Area());
- Console.WriteLine("圆柱体表面积:{0}", c.Area());
- Console.ReadLine();
- }
- }
- }
- using System;
-
- namespace Demo
- {
- class Vehicle
- {
- string name; //定义字段
- public string Name //定义属性为字段赋值
- {
- get { return name; }
- set { name = value; }
- }
- public virtual void Move() //定义方法输出交通工具的形态
- {
- Console.WriteLine("{0}都可以移动", Name);
- }
- }
- class Train : Vehicle
- {
- public override void Move() //重写方法输出交通工具形态
- {
- Console.WriteLine("{0}在铁轨上行驶", Name);
- }
- }
- class Car : 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();
- }
- }
- }