通过继承实现的不同对象调用相同的方法,表现出不同的行为,成为多态。C#中的每种类型都是多态的。当派生类从基类继承时,它会获得基类所有方法、字段、属性和事件。面向对象的语言适用虚方法表达多态。
多态是面向对象程序设计的基本特征之一,它使得派生类的实例可以直接赋予基类的对象,然后直接通过这个对象调用派生类的方法。在C#中,类的多态性是通过在派生类中重写基类的虚方法实现的。
在C#中,方法在默认情况下不是虚拟的,但(除构造函数外)可以显式地声明为virtual,在方法前面加上virtual关键字,则称该方法为虚方法。将方法定义为虚方法后,可以在派生类中重写虚方法。重写虚方法需要使用override关键字,这样在调用方法时,可以调用对象类型的相应方法。
备注:类中的成员字段和静态方法不能声明为virtual,因为virtual只对类中的实例函数和属性有意义。
注意点:
- 覆写和被覆写的方法必须有相同的可访问性。
- 不能覆写static方法或非虚方法。
- 方法、属性和索引器,以及另一种成员类型:事件,都可以被声明为virtual和override。
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();
}
}
}