显式与隐式(Explicit And Implicit)

1.概念

1.1 显式

实现的单词Explicit意思是清楚的、明确的、详述的。所以,显式的“显”是指明显且清楚的实现,相对于接口来说,就是明显而清楚的指定了接口的实现。对于其他的逻辑来说,显式就是清楚且明确的指定了实现内容。
 

1.2 隐式

实现的单词Implicit意思是隐匿的、不言明的、绝对的。所以,隐式的实现是指想当然的实现,相对于接口来说,只要实现类的方法签名和返回值与接口定义的一致即视为接口的实现,并无显式的(清晰的、明确的)指定。
 

2.例子

2.1 代码

  1. using System;
  2. namespace ExplicitAndImplicit{
  3. //刀子
  4. public interface IKnife{
  5. void KillPeople();
  6. }
  7. //枪
  8. public interface IGun{
  9. void KillPeople();
  10. }
  11. //隐式实现
  12. public class WrongKillMachine:IKnife,IGun{
  13. public void KillPeople(){
  14. Console.WriteLine("切切切脑袋");
  15. }
  16. }
  17. //显式实现:
  18. //1.实现接口方法不需要加访问定义符
  19. //2.实现接口方法前面要加接口名.方法名,用来指定其实现的接口
  20. //2.实现接口方法只能被显式的调用,不能被隐式的调用:
  21. // 显式调用:
  22. public class KillMachine:IKnife,IGun{
  23. void IKnife.KillPeople(){
  24. Console.WriteLine("切切切");
  25. }
  26. void IGun.KillPeople(){
  27. Console.WriteLine("啪啪啪");
  28. }
  29. }
  30. public static class Case
  31. {
  32. public static void Begin(){
  33. Console.WriteLine("Design Pattern —— Explicit And Implicit:");
  34. //隐式实现
  35. WrongKillMachine w = new WrongKillMachine();
  36. w.KillPeople();
  37.  
  38. //显式实现
  39. IKnife k = new KillMachine();
  40. k.KillPeople();
  41. IGun g = new KillMachine();
  42. g.KillPeople();
  43. }
  44. }
  45. }

2.2 结果

2.3 例子解释

2.3.1 隐式

实现即为WrongKillMachine类,并没有指定每个接口的实现方法,而是通过一个签名与返回值一致的方法来隐式实现(Implicit、不言明的、绝对的、隐匿的)。

2.3.2 显式

的实现即为KillMachine类,指定了每个接口实现的方法(KillPeople),相较于隐式的实现,它更加的清晰、明确、详述。
 

2.4 结合上面的例子写一个小故事

杀手跟他的助手说:“给我来一个能杀人的家伙”;
“用这个吧!”,助手从包里拿出了一个又像刀又像枪的家伙“这个是研究所刚刚给咱们研发的武器,外号杀人机器(KillMachine)‘要你命3000’,它集成了手枪与刀子的能力”
“怎么用呢?”杀手一知半解
“只要喊出语音指令‘KillPeople’,程式会自动执行的。”
“OK!”
杀手尾随它的目标来到车库,突然之间将无辜的John踢倒,用手锁住他的关节和身体并将自身的重量转移到上面,让John动弹不得。随后,他拿出了YaoNiMing3000,握住手柄,
慢慢的将枪口对准了John的心脏,心中默默为这位无辜的人祈祷着。“阿门......”。
"K-I-L-L,P-E-O-P-L-E!",响亮的吼声在无人的车库中回荡,John紧闭着双眼等待着死亡的来临。
“咔咔咔哒哒”,随着要你命3000中机械齿轮发出的声音,从枪口中“嗖”的一下,弹出一个一公分长的小刀。
John懵逼了。Σ( ° △ °|||)︴
杀手也懵逼了。Σ( ° △ °|||)︴
事后得知,是研发的博士让机器隐式实现了KillPeople方法,导致在调用的时候没有分开到底是具体哪一个功能的实现,结果功能都写到了一起,搞出了这个笑话。
所以,他将WrongKillMachine类停用,换成了KillMachine类,调用时也直接采用其抽象接口进行调用,这样就避免了一系列的问题,后期修改代码也更加方便了。
 

3.其他认证

3.1 关于一个类多个接口的实现既有显式也有隐式的规则(混合)

  1. using System;
  2. namespace ExplicitAndImplicit
  3. {
  4. public interface InfA{
  5. void Do();
  6. }
  7. public interface InfB{
  8. void Do();
  9. }
  10. public interface InfC{
  11. void Do();
  12. }
  13. public interface InfD{
  14. void Do();
  15. }
  16. public class Class1:InfA,InfB,InfC,InfD{
  17. void InfA.Do(){
  18. Console.WriteLine("A");
  19. }
  20. void InfB.Do(){
  21. Console.WriteLine("B");
  22. }
  23. public void Do(){
  24. Console.WriteLine("C");
  25. }
  26. }
  27. //测试目的是看多个接口实现是否可以部分显式、部分隐式,答案是肯定的
  28. //同样,显式接口必须通过接口的声明实现 比如 Interface i = new Class();
  29. public static class Case2_TestMultiIntegration{
  30. public static void Begin(){
  31. Utility.UnitStart(,"1.2.1 Implicit-通过隐式方式调用隐式实现的借口 Class c = new Class(); c.DoMethod();");
  32. Class1 c = new Class1();
  33. c.Do();
  34. Utility.UnitStart(,"1.2.2 Explicit-通过显式方式调用显式方式实现的借口 Interface i = new Class(); i.DoMethod();");
  35. InfA a = new Class1();
  36. a.Do();
  37. Utility.UnitStart(,"1.2.3 MixedImplicit-通过显式方式调用隐式实现的接口 Interface i = new Class(); i.DoMethod();");
  38. InfD d = new Class1();
  39. d.Do();
  40. }
  41. }
  42. }

3.2 结果:

4.应用原则

  在逻辑比较复杂的情况下,比如一个类继承了多个接口,这些接口具有相同的行为,但却在实现上有差异(比较拗口,我觉得可以理解成平板电脑继承了MP3、CD、电脑的接口)的时候,再应用显式实现,大多数逻辑比较清晰的时候不需要用显式实现。是否必须要抽象出这么多有类似概念的接口也是一个课题,不过不在这个范围内讨论,关键是理解显式与隐式的概念。

显式与隐式(ExplicitAndImplicit)的更多相关文章

  1. dll的加载方式主要分为两大类,显式和隐式链接

    之前简单写过如何创建lib和dll文件及简单的使用(http://blog.csdn.net/betabin/article/details/7239200).现在先再深入点写写dll的加载方式. d ...

  2. 【RS】CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Collaborative Filtering-CoupledCF:在推荐系统深度协作过滤中学习显式和隐式的用户物品耦合

    [论文标题]CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Colla ...

  3. C++ 不具有继承关系的类之间的显式,隐式转换 2013-07-11 15:41

    好久没有写blog了,今天在学习c#的时候看到某一章节 讲类的隐式与显式转换.特此留笔,以供后续参考之用. 关于显式,隐式转换有些争论,说什么不建议隐式转换.但是个人认为非必要,如果有良好的基础书写基 ...

  4. Scala中的Implicit(隐式转换,隐式参数,隐式类)

    文章来自:http://www.cnblogs.com/hark0623/p/4196452.html  转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...

  5. 实例理解scala 隐式转换(隐式值,隐式方法,隐式类)

    作用 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.话不多说,直接测试 ImplicitHel ...

  6. (转载)Android理解:显式和隐式Intent

    Intent分两种:显式(Explicit intent)和隐式(Implicit intent). 一.显式(设置Component) 显式,即直接指定需要打开的activity对应的类. 以下多种 ...

  7. JavaScript 数据类型转换(显式与隐式)

    一.数据类型 JS中有5中简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String.还有一种复杂数据类型------Object,Object本质是 ...

  8. 【转】Android理解:显式和隐式Intent---- try catch

    原文网址:http://blog.csdn.net/xiao__gui/article/details/11392987 Intent是Android初学者比较难理解的一个东西.我这里以通俗易懂的语言 ...

  9. 简单的interface显式和隐式的实现

    一,新建接口 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// < ...

随机推荐

  1. SpringBoot-学习笔记

    启动方式 运行main方法 @SpringBootApplication public class BootApplication { public static void main(String[] ...

  2. (网页)JavaScript周末总结(一)

    本周学习的内容总结: 1. 2章在html中使用javascript. 2. 3章Javascript的基本概念. 3. 4章变量,作用域,内存问题. 1-1:2章以下内容: 1.包含javascri ...

  3. Python 爬虫实例(爬百度百科词条)

    爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入 ...

  4. coTurn 运行在Windows平台的方法及服务与客户端运行交互流程和原理

    coTurn是一个开源的STUN和TURN及ICE服务项目,只是不支持Windows.为了在window平台上使用coTurn源码,需要在windows平台下安装Cygwin环境,并编译coTurn源 ...

  5. Percona XtraBackup 安装介绍篇

    XtraBackup介绍 XtraBackup是Percona公司的开源项目,用以实现类似Innodb官方的热备份工具InnoDB Hot Backup的功能,它支持在线热备份(备份时不影响数据读写) ...

  6. jQuery ajax()使用serialize()提交form数据到后台

    1.选中要删除的学生信息 2.点击 删除选中 按钮,把复选框中的值取出提交到后台 3.后台获取选中的id 4.前端也跟着删除数据 示例代码: 前端代码: <!DOCTYPE html> & ...

  7. 洗礼灵魂,修炼python(86)--全栈项目实战篇(12)—— 利用socket实现文件传输/并发式聊天

    由于本篇博文的项目都很简单,所以本次开个特例,本次解析两个项目,但是都很简单的 项目一:用socket实现文件传输 本项目很简单,作为小项目的预热的,前面刚学完socket,这里马上又利用socket ...

  8. CSipIm断网重连崩溃原因分析

    断网重连之后的操作流程 拨打电话 ->调用SipService.makeCallOptions(),先重启一遍SipService保证PjSipService的各参数正常,尤其是create参数 ...

  9. IIS 部署问题 404

    在部署IIS环境中,偶尔会遇到 404 错误,就算以前遇到过,也因为时间久了导致大概知道是什么错了,具体解决方案觉忘了,所以留下一个记录,留给自己,也是给大家一点提醒.(注:错误信息也懒得截图了,希望 ...

  10. LeetCode算法题-Word Pattern(Java实现)

    这是悦乐书的第202次更新,第212篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第68题(顺位题号是290).给定一个模式和一个字符串str,找到str是否完全匹配该模 ...