首页/ 第 5 章 · C# 编程基础/ 第 67 课
LESSON 67 · C# 编程基础

多态 Polymorphism 与虚方法

多态已掌握。下一课学接口 Interface。

⏱ 约 14 分钟📊 难度:入门🗂 第 5 章 · C# 编程基础📍 第 67 / 300 课
课程进度
67 / 300

🎯本节学习目标

  • 理解多态的概念
  • 掌握 virtual/override
  • 会用父类引用处理子类

🚀课程导读

“同一个动作,不同对象表现不同”:所有敌人都会“攻击”,但普通怪和 Boss 攻击方式不同。这就是多态。

虚方法与重写

“可被改写的钩子”。

  1. 【virtual 虚方法】父类方法标 virtual,允许子类重写。
  2. 【override 重写】子类用 override 提供自己的实现。
  3. 例:class Animal { public virtual void Speak() { Debug.Log("动物叫"); } }
  4. class Dog : Animal { public override void Speak() { Debug.Log("汪汪"); } }
  5. class Cat : Animal { public override void Speak() { Debug.Log("喵喵"); } }
  6. 创建对象调用 Speak():Dog 输出汪汪,Cat 输出喵喵。
  7. 核心:调用的是“同一个方法名”,但根据实际对象类型执行不同实现。
💡
virtual + override 是多态的基础:父类定义“接口”,子类提供“实现”。

父类引用指向子类对象

多态的经典写法。

  1. 父类类型的变量可以指向子类对象:Animal a = new Dog();
  2. 调用 a.Speak() 时,实际执行的是 Dog 的 Speak(多态生效)。
  3. 【好处】用一个父类数组装所有子类:Animal[] zoo = { new Dog(), new Cat() };
  4. foreach (Animal a in zoo) { a.Speak(); } // 依次汪汪、喵喵
  5. 以后新增一个 Bird 类继承 Animal 并 override Speak,zoo 代码不用改就能处理它——这就是“开闭原则”。
  6. 这非常适合游戏里的“对象管理”:用一个 Enemy 列表管理普通怪和 Boss。
多态让代码“面向父类编程”,扩展新类型时不改旧代码,是专业架构的核心。

Unity 实战

多态管理敌人。

  1. 沿用上节课的 Enemy / Boss 类(Speak 换成 Attack 逻辑即可)。
  2. 在测试脚本里写:
  3. Enemy[] enemies = { new Enemy(), new Boss(), new Enemy() };
  4. foreach (Enemy en in enemies) { en.TakeDamage(50); en.ShowInfo(); }
  5. 播放:列表里的对象各自按自己的类型响应。
  6. 体会:一个数组、一个循环,管理了不同类型的敌人。
  7. 【注意】若父类没标 virtual 而子类想重写,会报错或静默隐藏,务必标 virtual。
💡
多态三要素:继承 + virtual/override + 父类引用。三者缺一不可。

常见错误与排查

错误:调用子类特有方法报错?
原因:父类引用看不到子类新增方法
解决:把引用类型设为子类,或用类型判断转型(如 if (en is Boss))——进阶。

动手练习

课后小任务(做出来才算真的学会)

  • 定义 Animal 基类与两个子类,各自 override Speak
  • 用父类数组存储子类对象并循环调用
  • 说出多态的三个条件

本节小结

多态已掌握。下一课学接口 Interface。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课继承 Inheritance