在C#中,多态(Polymorphism)是一种面向对象编程的核心概念,它允许我们以一种统一的接口处理不同类型的对象。多态性主要有两种形式:编译时多态(也称为静态多态或方法重载)和运行时多态(也称为动态多态或方法重写)。
### 1. 编译时多态(方法重载)
编译时多态通过方法重载实现。在同一作用域内,可以定义多个同名的方法,只要它们的参数列表不同(参数类型、数量或顺序),编译器就能根据调用时提供的参数类型和数量来确定调用哪个方法。
class Program
{
static void Print(int i)
{
Console.WriteLine($"Integer: {i}");
}
static void Print(string s)
{
Console.WriteLine($"String: {s}");
}
static void Main(string[] args)
{
Print(10); // 调用 Print(int)
Print("Hello"); // 调用 Print(string)
}
}
### 2. 运行时多态(方法重写)
运行时多态通过方法重写(Override)和接口实现(Implementation)来实现。当一个子类继承了一个父类,并且重写了父类中的某个方法时,运行时将根据对象的实际类型来决定调用哪个方法,而不是引用类型。
class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Some sound");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Woof!");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal();
Animal myDog = new Dog(); // 父类引用指向子类对象
myAnimal.MakeSound(); // 输出: Some sound
myDog.MakeSound(); // 输出: Woof!
}
}
在这个例子中,`myDog`虽然被声明为`Animal`类型,但由于它实际上指向的是`Dog`类的实例,所以在调用`MakeSound`方法时,会调用`Dog`类中重写的方法,这体现了多态的“运行时绑定”特性。
### 总结
多态性在C#中是实现灵活性和可扩展性的重要手段。通过方法重载和重写,我们可以在不修改现有代码的情况下,为程序添加新的功能或改变现有功能的行为。