0

0

C#如何实现接口和抽象类 C#接口与抽象类区别和用法

畫卷琴夢

畫卷琴夢

发布时间:2025-12-25 14:36:51

|

553人浏览过

|

来源于php中文网

原创

接口定义“能做什么”,抽象类定义“是什么”及“怎么做的一部分”;接口仅含成员签名、支持多实现,抽象类可含字段和实现、仅单继承,选择取决于设计意图而非语法。

c#如何实现接口和抽象类 c#接口与抽象类区别和用法

接口和抽象类都是C#中实现多态和代码复用的重要机制,但它们定位不同:接口定义“能做什么”,抽象类定义“是什么”以及“怎么做的一部分”。选哪个不看语法多酷,而要看设计意图。

接口(interface):契约式能力声明

接口只包含成员签名(方法、属性、事件、索引器),不带实现,也不允许字段、构造函数或访问修饰符(默认public)。从C# 8.0起支持默认方法实现,但本质仍是契约优先。

  • 一个类可实现多个接口,解决C#单继承限制
  • 适合定义跨领域、无继承关系的统一行为,比如IComparableIDisposableIAsyncEnumerable
  • 典型写法:public interface ILogger { void Log(string message); }
  • 实现时必须显式提供所有成员的具体逻辑,除非使用默认实现且不重写

抽象类(abstract class):半成品基类

抽象类可含抽象成员(无实现,强制子类重写)、具体成员(带实现)、字段、构造函数、甚至静态成员。它表达一种“类型归属”——子类本质上是它的特殊化。

AILOGO
AILOGO

LOGO123旗下的AI智能LOGO生成器,只需输入品牌名称就能免费在线生成公司logo设计及配套企业VI,轻松打造您的个性品牌!

下载
  • 一个类只能继承一个抽象类,但可同时实现多个接口
  • 适合有共用状态或基础逻辑的场景,比如StreamException等框架基类
  • 典型写法:public abstract class Shape { public abstract double Area { get; } public virtual void Draw() => Console.WriteLine("Drawing..."); }
  • 子类用override重写抽象成员,用base.调用父类已实现方法

关键区别速查表

能否实例化?都不能直接new,但抽象类可被继承后实例化,接口需由实现类实例化。
成员实现?接口成员默认无实现(C#8+可有默认实现,但不改变其契约本质);抽象类可混用抽象与具体成员。
字段/构造函数?接口不能有字段或构造函数;抽象类可以。
访问修饰符?接口成员隐式public,不可加private/protected;抽象类成员可设protected、internal等。
版本演进?给接口新增成员会破坏已有实现类(需全部修改);抽象类可加非抽象成员并提供默认行为,更易扩展。

怎么选?看这三个问题

  • 是否想表达“属于同一类事物”?→ 优先抽象类(如Animal → Dog/Cat)
  • 是否想让无关类型共享某项能力?→ 优先接口(如File、Network、Memory都可支持IReadable
  • 是否需要共享字段或构造逻辑?→ 只能用抽象类
  • 不确定时,先定义接口;后续发现共性逻辑再引入抽象基类(接口+抽象实现类组合很常见)

基本上就这些。接口管“协议”,抽象类管“谱系”。用对了,代码松耦合又易维护;混着乱用,后期改起来才真要命。

相关专题

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

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

254

2023.08.08

什么是c#
什么是c#

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

174

2023.08.31

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

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

290

2024.03.13

C#Task用法
C#Task用法

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

342

2024.03.14

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

311

2023.08.02

java多态详细介绍
java多态详细介绍

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

14

2025.11.27

java多态详细介绍
java多态详细介绍

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

14

2025.11.27

java多态详细介绍
java多态详细介绍

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

14

2025.11.27

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
极客学院Java8新特性视频教程
极客学院Java8新特性视频教程

共17课时 | 3.7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.8万人学习

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

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号