C# 多态性详解:从入门到实战

📅 发布时间:2026/7/10 12:11:06 👁️ 浏览次数:
C# 多态性详解:从入门到实战
在面向对象编程中多态Polymorphism是三大特性之一封装、继承、多态。它让程序具备更强的扩展能力和灵活性是编写高质量 C# 代码的关键能力。本文将系统讲解 C# 中多态的原理、实现方式以及实际开发中的应用场景帮助你真正理解“一个接口多种形态”的核心思想。一、什么是多态多态Polymorphism指的是同一个行为在不同对象上具有不同的表现形式。简单理解就是同一个方法调用在不同对象上产生不同的执行结果。例如在 Word 中按 F1 → 打开 Word 帮助在 Windows 中按 F1 → 打开系统帮助在浏览器中按 F1 → 打开浏览器帮助同样的操作不同的对象行为不同。二、C# 中的多态分类在 C# 中多态主要分为两类类型发生阶段实现方式静态多态编译期方法重载、运算符重载动态多态运行期virtual override、抽象类三、静态多态编译时多态静态多态是在编译阶段确定调用哪个方法。1️⃣ 方法重载Overload方法名相同但参数不同。✔ 重载规则参数类型不同 ✔参数个数不同 ✔仅返回值不同 ❌不允许示例Add 方法重载publicclassTestData{publicintAdd(inta,intb){returnab;}publicintAdd(inta,intb,intc){returnabc;}}调用TestDatadatanewTestData();Console.WriteLine(data.Add(1,2));// 2个参数Console.WriteLine(data.Add(1,2,3));// 3个参数 编译器如何判断根据参数列表匹配最合适的方法。示例打印不同类型classPrintData{publicvoidPrint(inti){Console.WriteLine(整数: i);}publicvoidPrint(doubled){Console.WriteLine(浮点数: d);}publicvoidPrint(strings){Console.WriteLine(字符串: s);}}静态多态特点编译期确定调用方法性能高不依赖继承适用于功能相似但参数不同的情况四、动态多态运行时多态动态多态是在程序运行时决定调用哪个方法。实现方式virtual虚方法override重写abstract抽象类五、虚方法实现多态基本语法publicvirtualvoidMethod(){}publicoverridevoidMethod(){}示例图形绘制系统publicclassShape{publicvirtualvoidDraw(){Console.WriteLine(执行基类绘图);}}子类classCircle:Shape{publicoverridevoidDraw(){Console.WriteLine(画一个圆形);}}classRectangle:Shape{publicoverridevoidDraw(){Console.WriteLine(画一个长方形);}}使用ListShapeshapesnewListShape{newCircle(),newRectangle()};foreach(varshapeinshapes){shape.Draw();}运行结果画一个圆形 画一个长方形这就是运行时多态。虽然变量类型是 Shape但实际执行的是子类方法。六、抽象类实现多态当父类只提供“规范”不提供实现时可以使用 abstract。示例计算面积abstractclassShape{publicabstractintArea();}子类必须实现classRectangle:Shape{intwidth;intheight;publicRectangle(intw,inth){widthw;heighth;}publicoverrideintArea(){returnwidth*height;}}调用ShapeshapenewRectangle(10,5);Console.WriteLine(shape.Area());抽象类规则不能实例化可以包含普通方法抽象方法必须在子类中实现抽象类不能被 sealed 修饰七、为什么多态如此重要在真实项目中多态可以✅ 降低耦合✅ 提高扩展性✅ 遵循开闭原则对扩展开放对修改关闭✅ 方便依赖注入✅ 实现插件式开发八、多态的核心思想面试高频一句话总结父类引用指向子类对象调用的方法取决于子类实现。例如ShapeshapenewCircle();shape.Draw();变量类型是 Shape对象类型是 Circle调用的是 Circle 的 Draw()九、多态 vs 重载 vs 重写对比重载重写发生阶段编译期运行期方法名相同相同参数必须不同必须相同关键字无特殊virtual override十、实战场景支付系统设计假设我们设计一个支付系统abstractclassPayment{publicabstractvoidPay(decimalamount);}实现不同支付方式classAliPay:Payment{publicoverridevoidPay(decimalamount){Console.WriteLine(支付宝支付amount);}}classWeChatPay:Payment{publicoverridevoidPay(decimalamount){Console.WriteLine(微信支付amount);}}调用PaymentpaymentnewAliPay();payment.Pay(100);如果新增classBankPay:Payment原有代码无需修改。这就是多态的威力。十一、进阶知识多态的底层原理C# 的动态多态基于方法表Virtual Table运行时类型识别CLR 动态绑定当方法被标记为 virtual 时会进入虚方法表vtable在运行时根据对象实际类型查找对应实现。十二、总结多态是面向对象的灵魂。记住三句话多态是同一个接口不同实现静态多态发生在编译期重载动态多态发生在运行期override如果你想写出高扩展、高内聚、低耦合的代码多态是必须掌握的核心能力。 最后一句话真正理解多态你的代码就不再是“堆功能”而是“设计系统”。如果你正在学习 C#建议你多写几个基类派生类的练习项目比如图形系统支付系统日志系统消息通知系统多态是从“写代码”走向“做架构”的第一步。