原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp
(Aty表示本人)
介绍
什么是显式和隐式接口
什么时候需要显式接口
更简洁的方法(ISP:接口隔离原则)
显式接口更多
结论
介绍
文章将讨论下显式接口,讨论它们与隐式接口的区别,以及为什么应该避免使用。
什么是显式和隐式接口
C#中有两种方式来实现接口:显式和隐式
定义如下接口:
当我们隐式的实现该接口时,代码如下:
绝大多数开发者实现接口都使用隐式实现。当我们要显式实现接口时,Send方法和Recevie方法将被定义成私有的,代码如下:
简单地来讲,隐式实现的方法是公开的(public),而显式实现的方法是私有的(private)。那问题来了,为什么会有public和private之分,又是什么情况下使用这两种实现方式。
什么时候需要显式接口
让我先事先声明:
当你的具体类不需要包含这个接口抽象时,可以使用显式实现。
我可以感觉到有多难理解以上声明。
我会慢慢地讲解,首先我们要理解"抽象"的含义。抽象:从客户端的角度,只需要显示必要的方法和属性。
以WeatherService类为例
如果有两个层对它进行调用,UI层和数据层。两个层关注的测重点不一样。在UI层中只是关心City和Temperature这两个属性,而数据层只关心Send和Receive这两个方法的调用
对于编程的最佳实践,我再声明一句:
一个好的软件架构拥有许多抽象类。
如果使用隐式实现,Send和Receive方法为公开的,则如果在UI层中调用,Send和Receive方法是可见的,但并没有使用到。一个好的方法则将实现改为显式实现,则方法为私有的,UI层中看不到这两个方法。那如何能使用这两个方法呢?在数据层中,如下调用:
更简洁的方法(ISP:接口隔离原则)
接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。使用多个专门的接口比使用单一的总接口要好。(百度百科)。
一个比较好的实现是再新建一个接口,IWeather接口,如下:
都通过隐式实现,这样在调用的过程中,UI将变量类型定义为IWeather,数据层定义为IRequest。
(注:其实Aty对这个还是不明白的,定义一个抽象类更好,接口定义行为,可能作者只是想说明接口隔离这个概念)
显式接口更多
当一个类实现多个接口时,而接口中又包含同名的方法,则需要使用显式实现。
显式接口结论
1.显式实现应该要避免,推荐使用ISP接口隔离原则
2.在一种情况下可以使用,当你出于某些原因,不能为具体类赋予接口的行为时则使用显式实现