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

c# 抽象方法和虚方法的区别

轻浩姑娘_4281

轻浩姑娘_4281

发布时间:2026-01-17 12:00:35

|

398人浏览过

|

来源于php中文网

原创

抽象方法必须定义在抽象类中且无方法体,虚方法可存在于普通类并带默认实现;前者是强制契约,后者是可选建议。

c# 抽象方法和虚方法的区别

抽象方法必须定义在抽象类里,且不能有方法体

这是最硬的限制:只要写了 abstract,就必须把整个类也标成 abstract,否则编译直接报错。而且抽象方法声明后只能跟个分号,不能写大括号和实现逻辑。

  • 错误写法:
    public class Animal { public abstract void Speak(); }
    → 编译器会提示“非抽象类不能包含抽象成员”
  • 正确写法:
    public abstract class Animal { public abstract void Speak(); }
  • 子类如果不 override 所有抽象方法,自己也会变成抽象类,无法 new 实例

虚方法可以存在于普通类,且必须带默认实现

virtual 方法本质是“可选覆盖的已实现方法”,它不要求继承者一定重写,也不强制父类是抽象的。

Percept Speaker ID
Percept Speaker ID

在多人对话中识别和追踪说话者,将说话者标签映射到姓名,并管理语音命令授权级别。

下载
  • 你可以直接实例化含 virtual 方法的类:
    var a = new Animal(); a.Speak(); // 输出默认行为
  • 子类不写 override 也没问题,调用时自动走基类逻辑
  • 但注意:virtual 不能和 private、static、abstract 同时出现 —— 这些修饰符语义冲突

重写语法一样,但约束力度天差地别

两者都用 override,但背后意图完全不同:抽象方法是“契约”,虚方法是“建议”。

  • 抽象方法未被重写 → 编译失败(CS0534):“类型未实现继承的抽象成员”
  • 虚方法未被重写 → 完全合法,运行时自动回退到基类实现
  • 想阻止子类再重写?虚方法可用 sealed override,抽象方法做不到(因为没实现可封)

什么时候该用 abstract,什么时候该用 virtual?

看设计意图:如果某个行为在所有子类中“必然不同”,且基类根本没法提供合理默认值,就用 abstract;如果基类能给出一个通用兜底行为,只是允许子类按需定制,就用 virtual。

  • 比如 Draw() 对图形基类:不同图形绘制逻辑完全无关 → 抽象方法更合适
  • 比如 ToString() 或 GetHashCode():基类已有合理默认实现 → 虚方法更自然
  • 混用常见:抽象类里既有 abstract 方法(强制实现),也有 virtual 方法(提供可选扩展点)
抽象方法不是“没写完的虚方法”,而是“故意留白的契约”;虚方法也不是“弱化的抽象方法”,而是“自带备胎的灵活接口”。漏掉这个区分,很容易在重构时把抽象类强行实例化,或在不该加 override 的地方硬塞重写逻辑。

热门AI工具

更多
DeepSeek

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

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

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

墨刀AI
墨刀AI Hot

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

WorkBuddy

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3048

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4349

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3689

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

386

2026.01.19

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

160

2026.09.23

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

80

2026.09.23

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

80

2026.09.23

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

40

2026.09.22

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

60

2026.09.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Anaconda与Miniconda选择说明
Anaconda与Miniconda选择说明

共0课时 | 0人学习

CentOS 官方文档
CentOS 官方文档

共0课时 | 0人学习

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

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