C# 面向对象核心:一文吃透多态(静态多态 + 动态多态完整讲解)

C# 面向对象核心:一文吃透多态(静态多态 + 动态多态完整讲解) 前言封装、继承、多态是面向对象编程三大基石前面我们学习了封装隐藏数据、继承复用代码而多态是继承体系的最终落地也是让代码具备高扩展性的关键特性。很多初学者分不清静态多态与动态多态也不理解多态到底解决了什么开发痛点今天结合通俗易懂的比喻 完整可运行案例从零拆解多态全部知识点。一、什么是多态1. 通俗理解同一个类型不同行为多态字面含义多种形态。核心定义同一个父类引用指向不同子类实例调用同名方法时执行各自子类独有的逻辑。举个生活化例子所有酒水都属于 “酒”父类剑南春、五粮液、酒鬼酒都是酒的子类。plaintext酒 a 剑南春 酒 b 五粮液 酒 c 酒鬼酒编译时只知道变量是 “酒”只有运行时喝下去才能分辨具体是哪一款酒每一种酒口感不同对应代码里就是同名方法执行不同逻辑这就是多态。2. 专业定义程序中父类引用变量指向的具体对象、方法调用逻辑编译阶段无法确定运行时才判定。无需修改原有业务代码就能切换不同子类实现一套引用适配多种实体让程序拥有多种运行状态。二、为什么要使用多态从反面案例看懂痛点我们用 QQ 宠物场景举例直观感受没有多态时代码的缺陷。1. 初始版本无继承、无多态代码极度冗余分别创建猫、狗两个独立类各自拥有Eat()进食方法主人类需要单独写喂猫、喂狗两个方法。public class Cat { public string Name { get; set; } public int Health { get; set; } public void Eat() { Health 10; Console.WriteLine(喵喵喵~鱼很好吃,健康值10); } } public class Dog { public string Name { get; set; } public int Health { get; set; } public void Eat() { Health 15; Console.WriteLine(汪汪汪~骨头不错哦,健康值15); } } // 主人类 public class Lady { public string Name { get; set; } public Lady(string name) Name name; // 单独喂猫 public void FeedCat(Cat cat) cat.Eat(); // 单独喂狗 public void FeedDog(Dog dog) dog.Eat(); }调用测试static void Main(string[] args) { Lady lily new Lady(lily); Dog dog new Dog() { Name 大黄, Health 60 }; Cat cat new Cat() { Name 蓝猫, Health 50 }; lily.FeedDog(dog); lily.FeedCat(cat); }代码存在两大致命问题重复代码过多猫、狗都有Name、Health属性重复定义扩展性极差后续新增鸟类、兔子宠物必须修改Lady主人类新增FeedBird、FeedRabbit方法违背开闭原则。2. 第一次优化抽取父类抽象类复用重复代码把宠物共有属性、抽象进食方法抽成父类Pet猫狗继承并重写Eat()public abstract class Pet { public string Name { get; set; } public int Health { get; set; } // 抽象进食方法强制子类重写 public abstract void Eat(); } public class Cat : Pet { public override void Eat() { Health 10; Console.WriteLine(喵喵喵~鱼很好吃,健康值10); } } public class Dog : Pet { public override void Eat() { Health 15; Console.WriteLine(汪汪汪~骨头不错哦,健康值15); } }此时解决了代码重复问题但主人类FeedCat、FeedDog两个方法依然存在新增宠物仍要修改主人类扩展性问题没有根治。3. 终极优化引入多态一套方法适配所有宠物利用父类引用接收所有子类对象主人只保留一个通用喂养方法public class Lady { public string Name { get; set; } public Lady(string name) Name name; // 父类Pet作为参数兼容所有Pet子类 public void Feed(Pet pet) { pet.Eat(); } }测试调用static void Main(string[] args) { Lady lily new Lady(lily); Pet dog new Dog() { Name 大黄, Health 60 }; Pet cat new Cat() { Name 蓝猫, Health 50 }; // 同一个Feed方法分别调用Dog、Cat的Eat实现 lily.Feed(dog); lily.Feed(cat); }多态带来的核心优势高扩展性新增鸟类只需要新建Bird : Pet并重写Eat()主人类代码完全不用改动代码精简统一入口方法消除大量重复业务函数解耦上层主人类只依赖抽象父类不依赖具体猫狗子类降低代码耦合。