在 C# 中,多态性(Polymorphism) 是面向对象编程(OOP)的核心概念之一,指同一操作作用于不同类的对象时,可以产生不同的行为。多态性允许通过统一的接口处理不同类型的对象,提高代码的灵活性和可扩展性。
多态的分类
C# 中的多态性分为两种形式:
编译时多态(静态多态):通过方法重载(Overloading)和运算符重载实现,编译器在编译时确定具体调用哪个方法。
运行时多态(动态多态):通过虚方法(virtual)、抽象类(abstract)和接口(interface)实现,具体调用的方法在运行时根据对象的实际类型决定。
多态的典型实现方式
- 方法重载(编译时多态)
public class Calculator {
// 重载 Add 方法
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b;
}
调用时会根据参数类型自动选择对应方法:
var calc = new Calculator();
calc.Add(1, 2); // 调用 int 版本
calc.Add(1.5, 2.5); // 调用 double 版本
- 虚方法重写(运行时多态)
public class Animal {
public virtual void MakeSound() {
Console.WriteLine("Animal makes a sound");
}
}
public class Dog : Animal {
public override void MakeSound() {
Console.WriteLine("Dog barks: Woof!");
}
}
public class Cat : Animal {
public override void MakeSound() {
Console.WriteLine("Cat meows: Meow!");
}
}
调用时根据对象的实际类型决定行为:
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.MakeSound(); // 输出 "Dog barks: Woof!"
animal2.MakeSound(); // 输出 "Cat meows: Meow!"
- 抽象类和抽象方法
public abstract class Shape {
public abstract double Area(); // 抽象方法,子类必须实现
}
public class Circle : Shape {
public double Radius { get; set; }
public override double Area() => Math.PI * Radius * Radius;
}
public class Square : Shape {
public double Side { get; set; }
public override double Area() => Side * Side;
}
调用时通过基类引用调用具体实现:
Shape shape1 = new Circle { Radius = 3 };
Shape shape2 = new Square { Side = 4 };
Console.WriteLine(shape1.Area()); // 输出 28.2743...
Console.WriteLine(shape2.Area()); // 输出 16
- 接口多态
public interface IPayment {
void ProcessPayment(double amount);
}
public class CreditCardPayment : IPayment {
public void ProcessPayment(double amount) {
Console.WriteLine($"Paid {amount} via Credit Card.");
}
}
public class PayPalPayment : IPayment {
public void ProcessPayment(double amount) {
Console.WriteLine($"Paid {amount} via PayPal.");
}
}
通过接口统一调用不同实现:
IPayment payment1 = new CreditCardPayment();
IPayment payment2 = new PayPalPayment();
payment1.ProcessPayment(100); // 输出 "Paid 100 via Credit Card."
payment2.ProcessPayment(50); // 输出 "Paid 50 via PayPal."
多态的核心优势
- 代码复用:通过基类或接口统一操作不同类型的对象。
- 扩展性:新增子类或实现类时无需修改现有代码(符合开闭原则)。
- 灵活性:运行时动态绑定对象的具体行为。
通过合理使用多态性,可以显著提高代码的可维护性和可扩展性。