C#接口的显隐实现

显示接口实现与隐式接口实现

何为显式接口实现、隐式接口实现?简单概括,使用接口名作为方法名的前缀,这称为“显式接口实现”;传统的实现方式,称为“隐式接口实现”。下面给个例子。

IChineseGreeting接口,如果需要具备中文的问好行为,需继承此接口。

 

 1 //IChineseGreeting.cs2  3     interface IChineseGreeting4 5     {6 7         void SayHello();8 9     }
10 
11 
12 
13 ChinesePeople类实现IChineseGreeting接口。
14 
15 
16 
17  //ChinesePeople.cs
18  
19     class ChinesePeople:IChineseGreeting
20 
21     {
22 
23         public void SayHello()
24 
25         {
26 
27             Console.WriteLine("你好!");
28 
29         }
30 
31 
32 
33     }
复制代码

这样的实现就是“隐式接口实现”,用public关键字作方法的访问修饰符,我们通常都是这么做的。

你可以这样调用:

 

  ChinesePeople chinese = new ChinesePeople();chinese.SayHello();   
复制代码

 

 

也可以这样调用

 

IChineseGreeting otherChinese = new ChinesePeople();otherChinese.SayHello();
复制代码

类和接口都能访问到SayHello()方法。

如果“显式接口实现”,就应该是这样。

 

1 //ChinesePeople.cs 2   3 class ChinesePeople:IChineseGreeting 4 5 { 6 7 void IChineseGreeting.SayHello() //注意:接口名限定方法名,并且没有public访问修饰符 8   9 { 10 11 Console.WriteLine("你好!"); 12 13 }
}
复制代码

特别提醒:用于实现一个接口的所有方法都必须具有public可访问性。但是,假如使用显式接口实现,不应该为方法添加一个访问修饰符。

 

这时你只能这样调用:

 

 

  IChineseGreeting otherChinese = new ChinesePeople();otherChinese.SayHello();
复制代码

不能通过类来调用

 

ChinesePeople chinese = new ChinesePeople();chinese.SayHello(); //错误,不能访问。
复制代码

记住:显示实现,只有接口可以访问。

 

显示接口实现看起来有点繁琐,而且还不能通过类来访问接口方法。为什么还要有“显式实现接口”呢?

其实,多个接口可能包含具有相同名称、相同返回类型和相同参数的方法。如果一个类实现了多个接口,而且接口中的方法具有相同的签名,就可以通过显式接口实现来消除它们之间的歧义。显式接口实现标识出哪个方法属于哪个接口。

 

IEnglishGreeting接口,如果需要具备英文的问好行为,需继承此接口。

 

1 //IEnglishGreeting.cs
2  
3     interface IEnglishGreeting
4 
5     {  
6 
7         void SayHello();
8 
9     }
复制代码

可以发现,该接口中的SayHello方法签名和IChineseGreeting接口中一样。

 

 1 class ChinesePeople:IChineseGreeting,IEnglishGreeting2 3     {4 5         void IChineseGreeting.SayHello()6 7         {8 9             Console.WriteLine("你好!");
10 
11         }
12 
13         void IEnglishGreeting.SayHello()
14 
15         {
16 
17             Console.WriteLine("Hello!");
18 
19         }
20 
21 
22 
23 }
复制代码

 

 

可以这样调用:

 

ChinesePeople chinese = new ChinesePeople();(chinese as IChineseGreeting).SayHello();(chinese as IEnglishGreeting).SayHello();
复制代码

----------------------------------------------------------------------------------------

此外,如果显示实现接口的类中还有该类特有的方法,此时会带来一些不便。

例如,使ChinesePeople具有Play()方法。

 

 

这就带来一个问题,要调用SayHello()方法时,必须通过接口实现,而此时Play()方法就无法访问。因为现在将对象看作IChineseGreeting接口了,而接口中没有Play()方法。

同样,如果通过类实现,就无法访问到SayHello()方法。

必须通过强制转换来解决这个问题。

 

 

            IChineseGreeting chinese = new ChinesePeople();chinese.SayHello();//chinese.Play();  错误,无法访问(chinese as ChinesePeople).Play();//强制转换后,可以访问
复制代码

 

隐式接口实现不存在此问题。

 

总结:

  1. 当类实现一个接口时,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性。
  2. 当类实现多个接口时,并且接口中包含相同的方法签名,此时使用显式接口实现。即使没有相同的方法签名,仍推荐使用显式接口,因为可以标识出哪个方法属于哪个接口。
  3. 隐式接口实现,类和接口都可访问接口中方法。显式接口实现,只能通过接口访问。

转载于:https://www.cnblogs.com/xietianjiao/p/7009415.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亚马逊 各国站点 链接_使用Amazon S3和HTTPS的简单站点托管

亚马逊 各国站点 链接by Georgia Nola乔治亚诺拉(Georgia Nola) 使用Amazon S3和HTTPS的简单站点托管 (Simple site hosting with Amazon S3 and HTTPS) Hiya folks!大家好! In this tutorial I’ll show you how to host a static website with HTTPS on AWS wit…

leetcode 387. 字符串中的第一个唯一字符(hash)

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 示例: s “leetcode” 返回 0 s “loveleetcode” 返回 2 class Solution { public int firstUniqChar(String s) { int[][] tempnew i…

marlin 三角洲_三角洲湖泊和数据湖泊-入门

marlin 三角洲Data lakes are becoming adopted in more and more companies seeking for efficient storage of their assets. The theory behind it is quite simple, in contrast to the industry standard data warehouse. To conclude this this post explains the logica…

tomcat中设置Java 客户端程序的http(https)访问代理

1、假定http/https代理服务器为 127.0.0.1 端口为8118 2、在tomcat/bin/catalina.sh脚本文件中设置JAVA_OPTS,如下图: 保存后重启tomcat就能生效。转载于:https://www.cnblogs.com/zhangmingcheng/p/11211776.html

java界面中显示图片_java中怎样在界面中显示图片?

方法一:JLabel helloLabel new JLabel("New label");helloLabel.setIcon(new ImageIcon("E:\\javaSE\u4EE3\u7801\\TimeManager\\asset\\hello.gif"));helloLabel.setBackground(Color.BLACK);helloLabel.setBounds(0, 0, 105, 50);contentPan…

one-of-k 编码算法_我们如何教K-12学生如何编码

one-of-k 编码算法by Christopher George克里斯托弗乔治(Christopher George) 我们如何教K-12学生如何编码 (How we’re teaching K-12 students how to code) Hello World! (Sorry, I couldn’t resist.) My name is Christopher George and I am currently a Junior at Carn…

knime简介_KNIME简介

knime简介Data Science is abounding. It considers different realms of the data world including its preparation, cleaning, modeling, and whatnot. To be precise, it is massive in terms of the span it covers and the opportunities it offers. Needless to say, th…

hadoop2.x HDFS快照介绍

说明:由于近期正好在研究hadoop的快照机制。看官网上的文档讲的非常仔细。就顺手翻译了。也没有去深究一些名词的标准译法,所以可能有些翻译和使用方法不是非常正确,莫要介意~~ 原文地址:(Apache hadoop的官方文档&…

MQTT服务器搭建--Mosquitto用户名密码配置

前言: 基于Mosquitto服务器已经搭建成功,大部分都是采用默认的是允许匿名用户登录模式,正式上线的系统需要进行用户认证。 1.用户参数说明 Mosquitto服务器的配置文件为/etc/mosquitto/mosquitto.conf,关于用户认证的方式和读取的…

java number string_java基础系列(一):Number,Character和String类及操作

这篇文章总结了Java中最基础的类以及常用的方法,主要有:Number,Character,String。1、Number类在实际开发的过程中,常常会用到需要使用对象而不是内置的数据类型的情形。所以,java语言为每个内置数据类型都…

谁参加了JavaScript 2018状况调查?

by Sacha Greif由Sacha Greif 谁参加了JavaScript 2018状况调查? (Who Took the State of JavaScript 2018 Survey?) 我们如何努力使调查更具代表性 (How we’re working to make the survey more representative) I was recently listening to a podcast episode…

机器学习 建立模型_建立生产的机器学习系统

机器学习 建立模型When businesses plan to start incorporating machine learning to enhance their solutions, they more often than not think that it is mostly about algorithms and analytics. Most of the blogs/training on the matter also only talk about taking …

CDH使用秘籍(一):Cloudera Manager和Managed Service的数据库

背景从业务发展需求,大数据平台须要使用spark作为机器学习、数据挖掘、实时计算等工作,所以决定使用Cloudera Manager5.2.0版本号和CDH5。曾经搭建过Cloudera Manager4.8.2和CDH4,在搭建Cloudera Manager5.2.0版本号的时候,发现对…

leetcode 455. 分发饼干(贪心算法)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]…

压缩/批量压缩/合并js文件

写在前面 如果文件少的话,直接去网站转化一下就行。 http://tool.oschina.net/jscompress?type3 1.压缩单个js文件 cnpm install uglify-js -g 安装 1>压缩单个js文件打开cmd,目录引到当前文件夹,cduglifyjs inet.js -o inet-min.js 或者 uglifyjs i…

angular依赖注入_Angular依赖注入简介

angular依赖注入by Neeraj Dana由Neeraj Dana In this article, we will see how the dependency injection of Angular works internally. Suppose we have a component named appcomponent which has a basic and simple structure as follows:在本文中,我们将看…

leetcode 85. 最大矩形(dp)

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例 1: 输入:matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“…

如何查看系统版本

1. winR,输入cmd,确定,打开命令窗口,输入msinfo32,注意要在英文状态下输入,回车。然后在弹出的窗口中就可以看到系统的具体版本号了。 2.winR,输入cmd,确定,打开命令窗口,输入ver&am…

java activemq jmx_通过JMX 获取Activemq 队列信息

首先在 activemq.xml 中新增以下属性在broker 节点新增属性 useJmx"true"在managementContext 节点配置断开与访问服务iP配置成功后启动下面来看测试代码/*** Title: ActivemqTest.java* Package activemq* Description: TODO(用一句话描述该文件做什么)* author LYL…

风能matlab仿真_发现潜力:使用计算机视觉对可再生风能发电场的主要区域进行分类(第1部分)

风能matlab仿真Github Repo: https://github.com/codeamt/WindFarmSpotterGithub回购: https : //github.com/codeamt/WindFarmSpotter This is a series:这是一个系列: Part 1: A Brief Introduction on Leveraging Edge Devices and Embedded AI to …