当前位置:首页 > Windows程序 > 正文

008.在C#中,显式接口VS隐式接口

2021-05-25 Windows程序

        文章将讨论下显式接口,讨论它们与隐式接口的区别,以及为什么应该避免使用。

什么是显式和隐式接口

        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.在一种情况下可以使用,当你出于某些原因,不能为具体类赋予接口的行为时则使用显式实现

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70950.html