在C#中,正常情况下使用接口的实现使用的是 隐式接口实现

public interface IParent1
{
void Medthod();
} public class Child : IParent1
{
public void Medthod()
{
Console.WriteLine("Child 中的实现方法");
}
}

C# 编译器假定Child中的Medthod的方法是对接口IParent1中Medthod方法的时候。C#编译器之所以这样做出假定,是因为Medthod方法的可访问性是public,而且接口方法的签名和新引入的方法完全一致。也就是说两个方法具有相同的参数和返回类型。如果新的Test方法被标记为virtual,C#编译器仍会认为该方法匹配与接口方法。

C# 会将新方法的实现和接口的实现认为是同一种实现。

static void Main(string[] args)
{
Child child = new Child();
child.Medthod();
IParent1 test1 = child;
test1.Medthod(); Console.ReadKey();
}

因为方法的实现和接口的实现被认定为同一种方法,那输出的结果就是一样的。

将定义那个接口名称作为方法名的前缀,例如上面的IParent1.Medthod()。创建的就是一个 显式接口方法实现(Explicit Interface Method Implementation ,EIMI)。注意,在C#中定义一个显式接口方法时,不允许指定可访问性(public或者private等)。否则编译器汇报错误,例如下图。

显式接口的实现类默认是private,防止其他类直接使用实例中的方法,只能通过接口来调用。EIMI的方法也不能标记为virtual,所以他不能重写。这是因为EIMI方法并非真的是类型对象模型的一部分,它是将一个接口(一组行为或者方法)连接到一个类型上,同时避免公开行为/方法的一种方式。所以使用类对象也不能点出改方法。

接口类在调用方法时,使用的也是显式实现中的实现。

static void Main(string[] args)
{
Child child = new Child();
child.Medthod();
IParent1 test1 = child;
test1.Medthod(); Console.ReadKey();
} public interface IParent1
{
void Medthod();
} public class Child : IParent1
{
public void Medthod()
{
Console.WriteLine("Child 中的实现方法");
} void IParent1.Medthod()
{
Console.WriteLine("显式实现的IParent的方法");
}
}

输出的结果:

参考博客:https://blog.csdn.net/u010533180/article/details/72954192

C#中的 隐式与显式接口实现的更多相关文章

  1. Scala 深入浅出实战经典 第62讲:Scala中上下文界定内幕中的隐式参数实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  2. Scala 中的隐式转换和隐式参数

    隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...

  3. javascript中的隐式类型转化

    javascript中的隐式类型转化 #隐式转换 ## "+" 字符串和数字 如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作. 如果其中一个操作数是对 ...

  4. 编写高质量代码改善C#程序的157个建议——建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理

    建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理 在标准的Dispose模式中,我们注意到一个以~开头的方法,如下: /// <summary> /// 必须,防止程序员忘记 ...

  5. 深入探究js中的隐式变量声明

    前两天遇到的问题,经过很多网友的深刻讨论,终于有一个相对可以解释的通的逻辑了,然后我仔细研究了一下相关的点,顺带研究了一下js中的隐式变量. 以下文章中提到的隐式变量都是指没有用var,let,con ...

  6. JavaScript中关于隐式转换的一些总结

    JavaScript运算符中的隐式转换规律:一.递增递减运算符(前置.后置)1.如果包含的是有效数字字符串或者是有效浮点数字符串,则会将字符串转换(Number())为数值,再进行加减操作,返回值的类 ...

  7. C++中的隐式转换和explicit

    隐式转换 c++中的数据类型转换分为隐式转换和显示转换: 显示转换即使用static_cast等方法进行转换,相关内容请参考 <C++数据类型转换>: 隐式转换则是编译器完成的,如,boo ...

  8. C#中的隐式转换

    你是否考虑过这个问题:为什么不同类型之间的变量可以赋值,而不需要强制转换类型?如: int i = 1; long l = i; object obj = 1; Exception exception ...

  9. C#中的隐式类型var——详细示例解析

    从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,它的具体类型由编译器根据上下文推断而出. 下面就让我来总结下隐式类型的一些特点: 1.va ...

随机推荐

  1. Python基础7:字符串方法

    1 * 重复输出字符串 print('helo '*4) 2 [],[:] 通过索引获取字符串中的字符,这里和列表中的切片操作是相同的,具体内容见列表 print('hello word'[2:]) ...

  2. CF1157B-Long Number题解

    原题地址 题目大意:有一个\(n\)位数,其中的数字只有\(1\)~\(9\),不包括\(0\),每个\(1\)~\(9\)的数字有一个映射,映射也在\(1\)~\(9\)中,现在我们可以对这个\(n ...

  3. linux下实用的快速随机生成复杂密码

    linux下实用的快速随机生成复杂密码 [root@test.db-audit.1 ~]# </dev/urandom tr -dc '1234567890!@#$%abcdefghigklmn ...

  4. slickedit编译调试linux应用程序

    目录 slickedit编译调试linux应用程序 工程建立 编译 智能报错跳转 配置编译环境 调试 title: slickedit编译调试linux应用程序 date: 2019/3/19 17: ...

  5. 安装windows server 2008r2服务器操作系统

    R4900 G2 UEFI使用RAID-1000配置阵列 http://123.57.42.60/12755.html 首先进入到进到UEFI中阵列配置界面, 1Legacy BIOS Mode进入阵 ...

  6. 爬虫框架Scrapy 之(一) --- scrapy初识

    Scrapy框架简介 scrapy是基于Twisted的一个第三方爬虫框架,许多功能已经被封装好,方便提取结构性的数据.其可以应用在数据挖掘,信息处理等方面.提供了许多的爬虫的基类,帮我们更简便使用爬 ...

  7. centos6 & centos 7 防火墙设置

    转载:原文地址:http://blog.csdn.net/u011846257/article/details/54707864 Centos升级到7之后,内置的防火墙已经从iptables变成了fi ...

  8. Technocup 2019 - Elimination Round 1

    http://codeforces.com/contest/1030 B. Vasya and Cornfield 判断点是否在矩形内(包括边界) 把每条边转化为一个不等式 public static ...

  9. Jupyter Notebook中的快捷键

    1.快捷键 Jupyter Notebook 有两种键盘输入模式.编辑模式,允许你往单元中键入代码或文本:这时的单元框线是绿色的.命令模式,键盘输入运行程序命令:这时的单元框线是灰色. 命令模式 (按 ...

  10. Kafka(二)设计原理

    1.持久性 kafka使用文件存储消息,这就直接决定kafka在性能上严重依赖文件系统的本身特性.且无论任何OS下,对文件系统本身的优化几乎没有可能.因为kafka是对日志进行append操作,因此磁 ...