C#接口归纳总结实例详解
发布时间 - 2026-01-11 00:46:13 点击率:次C#接口的学习,在编程中,我们经常会用到接口,那什么是接口呢?

接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接口定义中指定的接口成员。
接口使用interface关键字进行定义,可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。
接口的特性:
1.接口类似于抽象基类,不能直接实例化接口;接口中的方法都是抽象方法,实现接口的任何非抽象类型都必须实现接口的所有成员:
当显式实现该接口的成员时,实现的成员不能通过类实例访问,只能通过接口实例访问。
当隐式实现该接口的成员时,实现的成员可以通过类实例访问,也可以通过接口实例访问,但是实现的成员必须是公有的。
2.接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型、不能包含静态成员。
3.接口成员是自动公开的,且不能包含任何访问修饰符。
4.接口自身可从多个接口继承,类和结构可继承多个接口,但接口不能继承类。
为什么不能指定接口中方法的修饰符?
接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。它们默认为公有方法。
interface IProgram
{
void Fun();
}
class Program:IProgram
{
//显式实现接口成员
void IProgram.Fun()
{
Console.WriteLine("I am Fun.");
}
staticvoid Main(string[] args)
{
IProgram p =new Program(); //声明一个接口实例,但不是对接口进行实例化
p.Fun();
Console.Read();
}
}
上面提到,实现接口可以显式实现和隐式实现,那么这两种实现到底有什么优缺点呢?
一般情况,当类或者结构要实现的是单个接口,可以使用隐式实现。
如果类或者结构继承了多个接口且接口中具有相同名称成员时,就要用到显式实现,当显式实现方式存在时,隐式实现方式就失效了。
interface IProgram
{
void Fun();
}
interface IAProgram
{
void Fun();
}
class Program : IProgram, IAProgram
{
void IProgram.Fun() //显式实现接口IProgram
{
Console.WriteLine("I am IProgram Fun.");
}
void IAProgram.Fun() //显式实现接口IAProgram
{
Console.WriteLine("I am IAProgram Fun.");
}
//public void Fun() //隐式实现接口
//{
// Console.WriteLine("I am Program Fun.");
//}
staticvoid Main(string[] args)
{
//IProgram p = new Program();
//p.Fun();
//IAProgram ap = new Program();
//ap.Fun();
Program pro =new Program();
((IProgram)pro).Fun();
((IAProgram)pro).Fun();
Console.Read();
}
}
结果为:I am IProgram Fun.
I am IAProgram Fun.
接口的继承:
接口继承和类继承不同:首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。
也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,
其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。
接口可以从零或多个接口中继承。从多个接口中继承时,用":"后跟被继承的接口名字,多个接口名之间用","分割。
被继承的接口应该是可以访问得到的,比如从private 类型或internal 类型的接口中继承就是不允许的。
接口不允许直接或间接地从自身继承。和类的继承相似,接口的继承也形成接口之间的层次结构。
interface IProgram
{
void Fun();
}
interface IAProgram:IProgram
{
}
class Program : IAProgram
{
void IProgram.Fun()
{
Console.WriteLine("I am IProgram Fun.");
}
staticvoid Main(string[] args)
{
Program pro =new Program();
((IAProgram)pro).Fun();
Console.Read();
}
}
接口的覆盖:
由于接口的实现没有方法体,抽象方法也没有方法体,那么当我们在接口的实现方法里调用抽象方法时,会如何执行呢?
interface IProgram
{
void Fun();
}
abstractclass AProgram : IProgram
{
publicabstractvoid AFun();
void IProgram.Fun()
{
AFun();
}
}
class Program:AProgram
{
publicoverridevoid AFun()
{
Console.WriteLine("I am AProgram.");
}
staticvoid Main(string[] args)
{
IProgram pro =new Program();
pro.Fun();
Console.Read();
}
}
//结果:I am Aprogram.
通过断点,可以看到,当执行pro.Fun();时,首先会跳到接口的实现方法里,然后去调用抽象函数的实现方法,当抽象函数的方法实现后,再回到接口的实现方法,直到执行完成。
当我们在实现接口的方法里调用虚函数呢?
interface IProgram
{
void Fun();
}
class AProgram : IProgram
{
publicvirtualvoid AFun() //注意这里是虚函数
{
Console.WriteLine("I am virtual AFun.");
}
void IProgram.Fun()
{
AFun();
}
}
class Program:AProgram
{
publicoverridevoid AFun() //这里是Override重写
{
Console.WriteLine("I am override AFun.");
}
staticvoid Main(string[] args)
{
IProgram pro =new Program();
pro.Fun();
Console.Read();
}
}
这时,我们发现,执行的顺序和上一个例子是相同的。所以结果为:I am override AFun.
由此,我们可以继续联想,当我们把override关键字,换成new呢?是不是也是同样的结果,还是和我们以前讲的例子一样,是隐藏呢?
我们把上面的例子进行改进:
interface IProgram
{
void Fun();
}
class AProgram : IProgram
{
publicvirtualvoid AFun()
{
Console.WriteLine("I am virtual AFun.");
}
void IProgram.Fun()
{
AFun();
}
}
class Program:AProgram
{
publicnewvoid AFun()
{
Console.WriteLine("I am new AFun.");
}
staticvoid Main(string[] args)
{
Program pro =new Program();
((IProgram)pro).Fun();
pro.AFun();
Console.Read();
}
}
结果为:I am virtual AFun.
I am new AFun.
由于前面已经讲过了,这里不在对此进行分析,由此我们可知使用New关键字是对其进行隐藏,当对接口实现的方法里调用的是虚方法时,和类的执行过程是一样的。
接口和抽象类的区别。
接口用于规范,抽象类用于共性。
接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。
抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
抽象类可以提供某些方法的部分实现,接口不可以。
抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。
在抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一个类的规范了)。
接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。
此外接口不能包含字段、构造函数、析构函数、静态成员或常量。
C#中的接口和类有什么异同。
异:
不能直接实例化接口。
接口不包含方法的实现。
接口可以实现多继承,而类只能是单继承。
类定义可在不同的源文件之间进行拆分。
同:
接口、类和结构可从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口可以包含事件、索引器、方法和属性。
一个类可以实现多个接口。
希望本篇文章对您有所帮助
# C#接口详解
# C#接口
# C#接口在派生类和外部类中的调用方法示例
# 聊一聊C#接口问题 新手速来围观
# 日常收集C#接口知识(知识全面)
# C#接口实现方法实例分析
# C#接口interface用法实例
# C#接口(Interface)用法分析
# c#接口使用示例分享
# 京东联盟C#接口测试示例分享
# 多个
# 的是
# 抽象类
# 隐式
# 当我们
# 有什么
# 子类
# 类中
# 可以通过
# 可以实现
# 类似于
# 都是
# 是一个
# 都必须
# 过了
# 也没
# 这就是
# 修饰符
# 不可以
# 而在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
如何用PHP工具快速搭建高效网站?
三星、SK海力士获美批准:可向中国出口芯片制造设备
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
如何快速搭建虚拟主机网站?新手必看指南
如何快速生成凡客建站的专业级图册?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
JavaScript模板引擎Template.js使用详解
浅谈redis在项目中的应用
Laravel怎么上传文件_Laravel图片上传及存储配置
浅谈Javascript中的Label语句
手机软键盘弹出时影响布局的解决方法
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
EditPlus 正则表达式 实战(3)
Laravel怎么在Controller之外的地方验证数据
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
如何用狗爹虚拟主机快速搭建网站?
如何快速搭建高效WAP手机网站吸引移动用户?
如何在局域网内绑定自建网站域名?
如何在云主机上快速搭建网站?
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
实例解析Array和String方法
活动邀请函制作网站有哪些,活动邀请函文案?
如何用美橙互联一键搭建多站合一网站?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel如何生成URL和重定向?(路由助手函数)
如何用虚拟主机快速搭建网站?详细步骤解析
如何在服务器上三步完成建站并提升流量?
Laravel观察者模式如何使用_Laravel Model Observer配置
网站建设要注意的标准 促进网站用户好感度!
Laravel如何使用查询构建器?(Query Builder高级用法)
Laravel安装步骤详细教程_Laravel环境搭建指南
如何确保FTP站点访问权限与数据传输安全?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Laravel如何处理表单验证?(Requests代码示例)
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
如何挑选最适合建站的高性能VPS主机?
如何在阿里云ECS服务器部署织梦CMS网站?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何在Windows环境下新建FTP站点并设置权限?
香港服务器部署网站为何提示未备案?
如何用西部建站助手快速创建专业网站?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?

