C# - 多态:初学者指南

你好,有抱负的程序员们!今天,我们将深入探讨面向对象编程中最吸引人的概念之一:多态。不要被这个大词吓到 - 到了这个教程的结尾,你将像专业人士一样运用多态!

C# - Polymorphism

什么是多态?

在我们开始之前,让我们来分解这个花哨的术语。"Poly" 意味着许多,"morph" 意味着形态。所以,多态就是关于拥有多种形态。在编程中,它是对象根据上下文采取不同形态并表现出不同行为的能力。

想象你是一个变形者(那会多酷啊?)你可以是人类,猫,甚至是龙!这正是多态允许我们的代码做到的 - 根据需要采取不同的形态。

在 C# 中,我们有两种主要的多态类型:

  1. 静态多态(也称为编译时多态)
  2. 动态多态(也称为运行时多态)

让我们详细探讨每一种。

静态多态

静态多态发生在编译器在编译时就知道要调用哪个方法。这就像在离开家之前决定穿什么衣服 - 你提前知道!

函数重载

静态多态最常见的形式是函数重载。这就是当你有多个同名但参数不同的方法时。

让我们看一个例子:

public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}

public double Add(double a, double b)
{
return a + b;
}

public string Add(string a, string b)
{
return a + b;
}
}

在这个例子中,我们有三个 Add 方法:

  1. 一个用于相加两个整数
  2. 一个用于相加两个双精度浮点数
  3. 一个用于连接两个字符串

现在,让我们使用我们的 Calculator

Calculator calc = new Calculator();

int sum1 = calc.Add(5, 3);            // 使用 int 版本
double sum2 = calc.Add(3.14, 2.86);   // 使用 double 版本
string sum3 = calc.Add("Hello, ", "World!"); // 使用 string 版本

Console.WriteLine(sum1);  // 输出: 8
Console.WriteLine(sum2);  // 输出: 6
Console.WriteLine(sum3);  // 输出: Hello, World!

编译器根据我们传递的参数类型知道调用哪个 Add 方法。这就像拥有一把瑞士军刀 - 一个工具,多种用途!

动态多态

动态多态是在运行时决定调用哪个方法。这就像在舞台上即兴发挥 - 你决定当下要做什么!

动态多态的关键是使用 virtual 和 override 关键字。让我们看一个例子:

public class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("这个动物发出声音");
}
}

public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("这条狗吠叫: 汪!汪!");
}
}

public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("这只猫喵喵叫: 喵!喵!");
}
}

在这个例子中,我们有一个基类 Animal,它有一个虚拟的 MakeSound 方法。DogCat 类继承自 Animal 并覆盖了 MakeSound 方法。

现在,让我们看看动态多态的实际应用:

Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();

myAnimal.MakeSound();  // 输出: 这个动物发出声音
myDog.MakeSound();     // 输出: 这条狗吠叫: 汪!汪!
myCat.MakeSound();     // 输出: 这只猫喵喵叫: 喵!喵!

尽管 myDogmyCat 被声明为 Animal 类型,它们仍然使用它们自己的 MakeSound 方法。这就是动态多态的魔法!

多态的力量

多态允许我们编写更灵活和可重用的代码。想象你正在创建一个包含不同角色的游戏。每个角色可能会以不同的方式移动:

public class Character
{
public virtual void Move()
{
Console.WriteLine("这个角色移动。");
}
}

public class Warrior : Character
{
public override void Move()
{
Console.WriteLine("这个战士冲锋!");
}
}

public class Mage : Character
{
public override void Move()
{
Console.WriteLine("这个法师传送。");
}
}

public class Rogue : Character
{
public override void Move()
{
Console.WriteLine("这个盗贼悄悄潜行。");
}
}

现在,我们可以有一个角色列表并让它们全部移动:

List<Character> characters = new List<Character>
{
new Warrior(),
new Mage(),
new Rogue()
};

foreach (var character in characters)
{
character.Move();
}

// 输出:
// 这个战士冲锋!
// 这个法师传送。
// 这个盗贼悄悄潜行。

这就是多态的美妙之处 - 我们可以将所有这些不同的角色视为 Character 对象,但它们各自都以独特的方式行为。

多态方法的总结

以下是我们在本文中讨论的多态方法的快速参考表:

方法 类型 描述
函数重载 静态 多个同名方法但参数不同
虚拟/覆盖 动态 基类定义虚拟方法,派生类覆盖它们

结论

恭喜你!你已经迈出了进入多态世界的第一步。记住,像学习任何新技能一样,掌握多态需要练习。如果它立即没有让你恍然大悟 - 别气馁 - 继续编码,继续尝试,很快你将像一个真正的编程变形者一样塑造你的程序!

在我们结束之前,这里有一个编程笑话给你:为什么程序员喜欢暗模式?因为光会吸引虫子!

快乐的编码,未来的多态大师们!

Credits: Image by storyset