尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C# 多态性详解
多态Polymorphism是C# 面向对象编程OOP的三大特性之一封装Encapsulation继承Inheritance多态Polymorphism多态的核心思想同一个行为在不同对象中表现出不同的结果。简单理解父类引用指向子类对象调用同一个方法时根据实际对象类型执行不同代码。例如Animal animal; animal new Dog(); animal.Speak(); // 输出汪汪 animal new Cat(); animal.Speak(); // 输出喵喵虽然变量类型都是Animal但是执行结果不同这就是多态。一、多态的作用多态主要解决1. 提高代码扩展性没有多态Dog dog new Dog(); dog.Speak(); Cat cat new Cat(); cat.Speak();以后增加Bird bird new Bird(); bird.Speak();需要不断修改代码。使用多态Animal animal; animal new Dog(); animal.Speak(); animal new Cat(); animal.Speak(); animal new Bird(); animal.Speak();以后增加动物只需要继承Animal。二、C# 多态的实现方式C# 中主要有三种多态类型实现方式编译时多态方法重载Overload运行时多态虚方法virtual/override接口多态interface三、编译时多态方法重载1. 什么是方法重载同一个类中方法名相同参数列表不同例如class Calculator { public int Add(int a, int b) { return a b; } public double Add(double a, double b) { return a b; } public int Add(int a, int b, int c) { return a b c; } }调用Calculator c new Calculator(); Console.WriteLine(c.Add(1,2)); Console.WriteLine(c.Add(1.5,2.5)); Console.WriteLine(c.Add(1,2,3));输出3 4 6为什么叫编译时多态因为编译器根据参数类型决定调用哪个方法。例如Add(10,20)编译器看到int,int选择Add(int,int)四、运行时多态重点运行时多态是 C# 最常用的多态形式。依靠virtualoverridebase实现。1. virtual虚方法父类定义class Animal { public virtual void Speak() { Console.WriteLine(动物叫); } }virtual表示这个方法允许子类重新实现。2. override重写子类class Dog : Animal { public override void Speak() { Console.WriteLine(汪汪); } }另一个子类class Cat : Animal { public override void Speak() { Console.WriteLine(喵喵); } }3. 使用父类引用调用Animal a; a new Dog(); a.Speak(); a new Cat(); a.Speak();输出汪汪 喵喵这里发生了什么变量Animal a;编译类型Animal实际对象第一次Dog第二次Cat运行时根据对象真实类型决定调用哪个方法。这就是动态绑定Dynamic Binding五、完整运行时多态案例假设开发一个游戏所有角色都有攻击方法class Role { public virtual void Attack() { Console.WriteLine(普通攻击); } }战士class Warrior : Role { public override void Attack() { Console.WriteLine(挥剑攻击); } }法师class Mage : Role { public override void Attack() { Console.WriteLine(释放魔法); } }弓箭手class Archer : Role { public override void Attack() { Console.WriteLine(射箭攻击); } }统一调用ListRole roles new ListRole() { new Warrior(), new Mage(), new Archer() }; foreach(Role role in roles) { role.Attack(); }输出挥剑攻击 释放魔法 射箭攻击优势以后增加class Assassin : Role { public override void Attack() { Console.WriteLine(暗杀); } }原代码foreach(Role role in roles) { role.Attack(); }无需修改。这就是开闭原则Open Closed Principle六、隐藏方法 new 与 override 区别很多初学者容易混淆override真正实现多态class Dog:Animal { public override void Speak() { Console.WriteLine(狗叫); } }调用Animal anew Dog(); a.Speak();输出狗叫new 隐藏方法class Dog:Animal { public new void Speak() { Console.WriteLine(狗叫); } }调用Animal anew Dog(); a.Speak();输出动物叫因为new不产生多态只隐藏父类方法。七、抽象类实现多态如果父类没有具体实现可以使用abstract父类abstract class Shape { public abstract double Area(); }圆class Circle : Shape { public double Radius; public override double Area() { return Math.PI * Radius * Radius; } }矩形class Rectangle : Shape { public double Width; public double Height; public override double Area() { return Width * Height; } }调用Shape s; snew Circle(); Console.WriteLine(s.Area()); snew Rectangle(); Console.WriteLine(s.Area());八、接口实现多态接口是 C# 中非常重要的多态方式。定义interface IAnimal { void Speak(); }实现class Dog:IAnimal { public void Speak() { Console.WriteLine(汪汪); } }class Cat:IAnimal { public void Speak() { Console.WriteLine(喵喵); } }调用IAnimal animal; animalnew Dog(); animal.Speak(); animalnew Cat(); animal.Speak();输出汪汪 喵喵九、virtual、abstract、interface区别特性virtualabstractinterface是否有实现可以有没有没有子类是否必须重写否必须必须所在位置普通类抽象类接口支持多继承否否是用途扩展已有行为定义规范定义能力十、多态的底层原理简单理解例如Animal a new Dog(); a.Speak();内存a | | ---- Dog对象 | Speak()运行时找到对象真实类型查看虚方法表Virtual Table调用 Dog 的 Speak()因此Animal | | Dog可以执行Dog.Speak()十一、多态常见应用场景1. 游戏开发角色Character ├── Warrior ├── Mage └── Archer统一character.Attack();2. 支付系统Payment | -- Alipay | -- WeChatPay | -- BankPay调用payment.Pay();3. 数据库访问Database | -- MySQL | -- SQLServer | -- Oracle统一database.Connect();十二、多态设计原则优秀的多态设计面向抽象编程不要Dog dognew Dog();推荐Animal animalnew Dog();少使用类型判断不推荐if(animal is Dog) { } else if(animal is Cat) { }应该animal.Speak();让对象自己处理行为。十三、总结概念关键字说明方法重载无编译时多态虚方法virtual允许重写方法重写override实现运行时多态抽象方法abstract强制子类实现接口interface规范多态一句话总结C# 多态就是通过父类或接口引用指向不同子类对象让同一个方法调用产生不同的行为从而提高程序的扩展性和可维护性。
RELATED

相关推荐

Mamba-YOWO 与 YOWOv3 对比:参数量减少 7.3%,UCF101-24 帧级 mAP 提升 2.1%

Mamba-YOWO 与 YOWOv3 对比:参数量减少 7.3%,UCF101-24 帧级 mAP 提升 2.1%

Mamba-YOWO:轻量化时空动作检测框架的技术突破与性能解析 在实时视频分析领域,时空动作检测技术正面临计算效率与检测精度的双重挑战。传统3D卷积网络虽然能够有效捕捉时序特征,但其庞大的参数量和计算成本严重制约了在边缘设备上的部署可行性…

📅 2026/9/8 18:36:44
中教睿海靠谱吗?CCTV认证与退役军人网官方合作实力验证

中教睿海靠谱吗?CCTV认证与退役军人网官方合作实力验证

"中教睿海靠谱吗?"这是每一位准备报名军队文职培训的考生都会问的问题。在军队文职培训行业乱象频发的背景下,这个问题显得尤为重要。2025年,教育部等多部委联合开展军队文职人员考试培训专项整治,明确指出部分机构存在…

📅 2026/9/11 4:55:35
5秒极速破解百度网盘提取码:开源神器baidupankey完全指南

5秒极速破解百度网盘提取码:开源神器baidupankey完全指南

5秒极速破解百度网盘提取码:开源神器baidupankey完全指南 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘加密资源而烦恼吗?每…

📅 2026/7/26 14:28:25
MORE NEWS

更多资讯

📰

Actual 账户管理完全指南:从预算账户的创建、关闭到重命名

Actual 账户管理完全指南:从预算账户的创建、关闭到重命名 【免费下载链接】actual A local-first personal finance app 项目地址: https://gitcode.com/GitHub_Trending/ac/actual 本篇技术指南以 Actual 官方文档《Accounts Overview》为骨架,…

📰

Pulsar Developer Day:消息中间件技术盛会与应用实践

1. Pulsar Developer Day:消息中间件开发者的年度盛会Apache Pulsar作为新一代分布式消息中间件,正在全球范围内获得越来越多的关注和应用。Pulsar Developer Day作为COSCon25的重要同场活动,为开发者们提供了一个深入交流Pulsar技术实践的平…

📰

南京玄武区壁挂炉维修哪家靠谱,欧米到家专业师傅快速上门解决不点火漏水故障

文章简介南京冬季采暖需求较高,壁挂炉作为家庭供暖和生活热水的重要设备,长期使用后容易出现不点火、不供暖、热水忽冷忽热、故障代码报警、水压异常、漏水等问题。欧米到家专注南京壁挂炉维修服务,提供燃气壁挂炉、电壁挂炉、冷凝壁挂炉、采…

📰

南京壁挂炉热水忽冷忽热维修,欧米到家排查换热器水流传感器以及温控故障

文章简介南京冬季采暖需求较高,壁挂炉作为家庭供暖和生活热水的重要设备,长期使用后容易出现不点火、不供暖、热水忽冷忽热、故障代码报警、水压异常、漏水等问题。欧米到家专注南京壁挂炉维修服务,提供燃气壁挂炉、电壁挂炉、冷凝壁挂炉、采…

📰

南京壁挂炉漏水维修怎么办,欧米到家检查水路系统压力异常以及配件老化问题

文章简介南京冬季采暖需求较高,壁挂炉作为家庭供暖和生活热水的重要设备,长期使用后容易出现不点火、不供暖、热水忽冷忽热、故障代码报警、水压异常、漏水等问题。欧米到家专注南京壁挂炉维修服务,提供燃气壁挂炉、电壁挂炉、冷凝壁挂炉、采…

📰

Fluent电弧建模:MHD框架与工程实践指南

1. 电弧模型基础与Fluent实现原理电弧作为高温等离子体放电现象,在工业焊接、断路器设计、航天推进等领域具有关键应用。Fluent作为领先的CFD仿真平台,其电弧建模能力通过以下核心模块实现:1.1 物理场耦合架构Fluent采用MHD(磁流体…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬