讲师中心 微信公众号
AI工具推荐 视频效率加速

C#怎么实现多态性_C#如何通过接口和继承重写方法【详解】

云磊酱_1073

云磊酱_1073

发布时间:2026-03-28 14:16:03

|

683人浏览过

|

来源于php中文网

原创

多态的核心是“什么时候必须用”,即当一组对象行为不同但调用方式需统一时(如FileLogger、DbLogger等共用Log方法)才必须使用;否则易因未标记virtual/abstract、访问修饰符缺失或签名不一致导致多态失效。

c#怎么实现多态性_c#如何通过接口和继承重写方法【详解】

多态的核心不是“怎么写”,是“什么时候必须用”

多态在 C# 里不是炫技手段,而是当你有一组对象,它们行为不同但调用方式要统一时的刚需。比如日志记录器:FileLogger、DbLogger、ConsoleLogger 都该有 Log(string message),但具体怎么存,由各自决定——这时你就绕不开多态。

常见错误现象:new 出来子类对象却用父类变量接收,但没声明虚方法或没重写,结果调的还是父类空实现;或者接口方法写了 public void DoWork(),却忘了在实现类里加 public(C# 要求显式访问修饰符),编译直接报错:'DoWork' in explicit interface implementation must have a public access modifier。

  • 必须用 virtual 标记父类方法,子类才能用 override;abstract 更狠,强制子类实现
  • 接口方法默认就是 public,实现类里必须写 public,不能省略
  • 如果父类方法没标 virtual 或 abstract,子类用 new 是隐藏而非重写,多态失效

interface vs abstract class:选哪个不看概念,看约束力

接口适合定义“能做什么”,抽象类适合定义“是什么+能做什么”。比如你有一堆设备:Printer、Scanner、Camera,都支持 PowerOn() 和 GetStatus(),但启动逻辑完全不同——用 IHardware 接口最干净;但如果所有设备共用一个序列号生成规则和固件版本字段,那就得上 abstract class HardwareBase。

性能影响几乎可忽略,但兼容性要注意:.NET 8 开始支持接口默认实现(default interface methods),但老项目若跑在 .NET Framework 4.8 或早期 .NET Core 上,接口里写实现体就编译不过。

  • 接口不能有字段、构造函数、非 public 成员;抽象类可以
  • 一个类只能继承一个抽象类,但能实现多个接口
  • 如果未来可能要加新方法且不想改所有实现类,接口 + 默认实现比抽象类更安全(只要新方法有默认体)

override 的三个硬条件缺一不可

写 override 不是光把父类方法抄一遍就行,C# 编译器会严格校验三件事:签名一致、可访问性不降级、基类方法确实标记了 virtual / abstract / override。漏一个就报错,比如:'Child.Log()' cannot override inherited member 'Parent.Log()' because it is not marked virtual, abstract, or override。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载

容易踩的坑:重写 ToString() 或 Equals(object) 时,忘了父类方法是 virtual(它们确实是),但自己写成了 public string ToString(string format) —— 签名变了,变成重载,不是重写,多态调不到。

  • 参数类型、数量、顺序必须和基类方法完全一致(包括 ref/out)
  • 返回类型必须相同(协变只适用于引用类型,且仅限于某些泛型接口,别乱试)
  • 不能改 virtual 方法的 sealed 状态:父类用 sealed override,子类就再也不能重写了

多态失效的典型现场:var、new、静态类型

你以为用了多态,其实只是表面像。比如:var logger = new FileLogger(); logger.Log("test"); —— 这里 logger 的静态类型是 FileLogger,根本没走多态,哪怕你把它赋给 ILogger 变量才真正启用多态调度。

另一个高频翻车点:反射创建对象后直接调用,没转成接口或基类引用。例如:Activator.CreateInstance(typeof(FileLogger)).Log("test") 会报错,因为返回的是 object,而 object 没有 Log 方法。

  • var 推导的是实际类型,不是接口/基类类型
  • 用 new 创建子类实例时,务必显式转型:(ILogger)new FileLogger() 或直接声明为接口类型:ILogger logger = new FileLogger();
  • 泛型方法里如果只约束 T : class,但没约束 T : ILogger,那 T 实例也无法调用 Log

多态真正的复杂点不在语法,而在设计初期就要想清楚:哪些行为必须统一入口,哪些状态必须共享,哪些扩展必须零修改原代码。一旦在基类里塞了具体实现又没留钩子,后面加新子类就只能复制粘贴或用 if-else 判断类型——那多态就彻底退化成 if 多态了。

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

1072

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

3111

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

905

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2635

2024.03.14

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

332

2026.02.03

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

429

2026.02.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

631

2026.03.11

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

329

2026.04.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn