C#中显/隐式实现接口及其访问方法
在实现接口的时候,VS提供了两个菜单,一个是"实现接口",一个是"显式实现接口",它们到底有何不一样呢
我们来比较一下看看
1.首先假设我们有一个接口
public interface ICustomer
{
void SomeMethod();//接口的所有成员都暗自成为abstract,我们不能为它提供缺省实现,无论这份实现是 多么平淡无奇;接口的成员也都暗自成为public,我们不能以关键字abstract或 public来修改(修饰)其中某个成员。
}
2.如果是"实现接口",那么代码大致如下
public class Customer:ICustomer
{
#region ICustomer 成员
public void SomeMethod()
{
throw new NotImplementedException();
}
#endregion
}
3.如果是"显式实现接口",那么代码大致如下
public class Customer:ICustomer
{
#region ICustomer 成员
void ICustomer.SomeMethod()//显示接口成员的访问级别暗中是public,不允许程序员再加任何修饰符
{
throw new NotImplementedException();
}
#endregion
}
大家看到差别了吧?显式实现的方式,那些方法都会加上一个前缀的。但是,这到底意味着什么呢?
如果是实现接口
public class DAL {
/// <summary>
/// 如果我们是直接实现接口的话,那么既可以用接口调用方法,也可以用具体类调用方法
/// </summary>
public void GetCustomer() {
Customer customer = new Customer();
customer.SomeMethod();
}
public void GetCustomer2() {
ICustomer customer = new Customer();
customer.SomeMethod();
}
}
如果是显式实现接口
public class DAL {
/// <summary>
/// 如果我们是显式实现接口的话,那么要访问里面的方法就只能是通过接口来调用,而不能通过具体类来做
/// </summary>
public void GetCustomer() {
ICustomer customer = new Customer();
customer.SomeMethod();
}
}
此外,我们还可以在继承接口的类中同时提供实现接口和显式实现接口两种方式,这样就完成了对一个接口成员提供多份实现实体,访问时可以用类的实例和接口的引用来分别调用这两种实现实体。
现在大部分的系统为了保证扩展性,都广泛地使用接口。显式实现接口,可以隐藏具体类的复杂性。
2{
3 void Paint();
4}
5public class EditBox : IControl
6{
7 public void Paint()
8 {
9 Console.WriteLine("Pain method is called!");
10 }
11}
12class Test
13{
14 static void Main()
15 {
16 EditBox editbox = new EditBox();
17 editbox.Paint();
18 ((IControl)editbox).Paint();
19 Console.ReadKey();
20 }
21}
结果:
Pain method is called!
说明:从实例中我们可以看到用隐式实现的接口既可以通过类来访问,也可以通过接口来访问!
2.显式实现的接口
2{
3 void Paint();
4}
5public class EditBox : IControl
6{
7 void IControl.Paint()
8 {
9 Console.WriteLine("IControl.Pain method is called!");
10 }
11}
12class Test
13{
14 static void Main()
15 {
16 EditBox editbox = new EditBox();
17 //editbox.Paint();//通过类访问会出错
18 ((IControl)editbox).Paint();
19 Console.ReadKey();
20 }
21}
结果:
说明:从实例中我们可以看到用显式实现的接口只能通过接口来访问,如果试图通过类来访问会出错:““ConsoleApplication1.EditBox”并不包含“Paint”的定义。”
3.同时用显/隐式实现接口会怎么样?
2{
3 void Paint();
4}
5public class EditBox : IControl
6{
7 void IControl.Paint()
8 {
9 Console.WriteLine("IControl.Pain method is called!");
10 }
11 public void Paint()
12 {
13 Console.WriteLine("Pain method is called!");
14 }
15}
16class Test
17{
18 static void Main()
19 {
20 EditBox editbox = new EditBox();
21 editbox.Paint();
22 ((IControl)editbox).Paint();
23 Console.ReadKey();
24 }
25}
结果:
IControl.Pain method is called!
说明:当同时用显/隐式实现接口时,显式才是真正的接口实现方法!
4.结论
在多数情况下,我们都是用隐式来实现接口,此时既可以通过类来访问,又可以通过接口来访问,而通过显式实现的接口则只能通过接口来访问,总结一下就是:当显式实现方式存在时,隐式实现方式就失效了。但这不能表示显式实现方式就不好,当一个类实现的多个接口中具有相同的方法时,用显式方式来专门实现某个接口的方法时就显得非常有用!
转载于:https://www.cnblogs.com/dudu837/archive/2009/12/07/1618663.html
C#中显/隐式实现接口及其访问方法相关推荐
- 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化
人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...
- 如何在 C# 中使用隐式和显式操作符
C# 有一个鲜为人知的特性是通过定义 显式和隐式操作符 实现类型之间的转换,这篇文章我们将会讨论如何使用这些 显式 和 隐式 操作符. 什么是显式,什么是隐式 隐式类型转换 它是运行时自动帮你完成的, ...
- Selenium中的隐式等待和显式等待
在Selenium中,"等待"在执行测试中起着重要作用.在本文中,您将学习Selenium中"隐式"和"显式"等待的各个方面. 在本文中,您 ...
- scala中的隐式转换、隐式参数和隐式类
scala中的隐式转换.隐式参数和隐式类 @(SCALA)[scala] scala中的隐式转换隐式参数和隐式类 一隐式转换 1示例 2隐式转换的条件 二隐式参数 1示例 三隐式类 1示例 隐式转换是 ...
- .NET 6 中的隐式命名空间引用
.NET 6 中的隐式命名空间引用 Intro 之前写过一篇隐式命名空间引用的大概介绍,在一些小的测试项目中也有在用,一直没作为示例给大家分享,主要原因在于之前看到了一个关于隐式命名空间引用的 Git ...
- java显示参数,Java中的隐式参数和显示参数实例详解
在学习java的过程中,我们会遇到许多的问题.下面我们就来看看什么是隐式参数和显示参数. 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数www.cppcns.com. 隐式参数 ...
- 一阶常微分方程的数值解法(二阶显式、隐式 Adams 公式及 Milne 方法)
一阶常微分方程的数值解法 这里我们介绍二阶显式.隐式 Adams 公式及 Milne 方法求解方程. 题目: 对初值问题 u ′ = u − t 2 , 0 ≤ t ≤ 1 , u ( 0 ) = 0 ...
- C语言中的隐式声明是什么,有什么危害?warning: implicit declaration of function ‘xxx’
今天编译一个代码,提示CUSTOM_LAYER里面有一个C文件函数gettimeofday()隐式声明,用man手册查了一下,需要包含头文件#include <sys/time.h> 那么 ...
- sql隐式转换_SQL Server中的隐式转换
sql隐式转换 This article will provide an overview of SQL Server implicit conversion including data type ...
最新文章
- Android之SurfaceView(二)
- mysql rollback函数_PHP mysqli_rollback() 函数_程序员人生
- .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译
- glusterfs初步实践一(类似NFS)
- C运行时库和标准C++库
- 编译安装php apache,CentOS编译安装Apache2.4+PHP5.6
- 简单的IDT HOOK介绍
- HOG(方向梯度直方图)
- java jpanel隐藏_java – 绘制JPanel隐藏菜单
- linux下限制一个文件夹大小的方法
- linux写语句自动执行一次,Linux系统下自动执行指定任务 cron
- 后面冒号_Python 数组中的冒号使用
- 【翻译】YARN Architecture
- 【前端工具】实用的代码生成器
- 微信Android热补丁方案Tinker
- form表单的action属性设置相对路径
- 全新 Google Pixel Watch 重磅上线 | 着手为 Wear OS 构建应用!
- 欢迎查看Vue总结知识
- 数据标注平台分析与使用经验
- python控制大疆无人机_大疆睿炽Tello EDU无人机python操控之二——使用Tello-Python-master示例程序控制Tello EDU无人机...