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

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

时间: 2024-10-26 20:51:18

008.在C#中,显式接口VS隐式接口的相关文章

1.扩展方法2.接口的隐式实现和显式实现

1.扩展方法:必须写在一个静态类里面,具体见代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 namespace ConsoleApplication1 {     class Program     {         static void Main(string[] args)         {             Student s = new Stud

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

我们在实现接口时,常常是类继承接口,然后在接口中实现相应的方法.代码如下: interface IOutput { void output(); } class SimpleOutput : IOutput { public void output() { Console.WriteLine("SimpleOutput ....."); } } 使用代码测试一下实现的结果 class Program { static void Main(string[] args) { SimpleO

JavaScript中显式原型和隐式原型的联系

显式原型:prototype 隐式原型:__proto__ 1.显式原型和隐式原型是什么? 在js中万物皆对象,方法(Function)是对象,方法的原型(Function.prototype)是对象,对象具有属性(__proto__)称为隐式原型,对象的隐式原型指向构造该对象的构造函数的显式原型. 方法(Function)是一个特殊的对象,除了和其他对象一样具有__proto__属性以外,它还有一个自己特有的原型属性(prototype),这个属性是一个指针,指向原型对象.原型对象也有一个属性

C# 接口的隐式与显示实现说明

以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,"显示接口实现"就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:"隐式接口实现".费话不说,例子如下: interface IAnimal { void Dog(); } class Animal:IAnimal { public void Dog() { Console.WriteLine(&quo

C# 接口的隐式与显示实现

以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习.  通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:“隐式接口实现”.费话不说,例子如下:      interface IAnimal { void Dog(); } class Animal:IAnimal { public void Dog() { Console.WriteLine("dog..."

显式Intent与隐式Intent的功能与使用方法解析。

显式Intent与隐式Intent的功能与使用方法解析. Intent,在中文中的意思是意图.就是想要做的事. 而使用startActivity(Intentintent)或者startActivityForResult(Intentintent)或者别的使用它的方法,形象地说就是指  去做你想要做的事.(do what you want to do) 首先,大体的介绍一下它们的使用差别: 1.Explicit Intent(显式意图):主要用于调用自身应用程序的组件(activity,serv

显示接口和隐式接口的区别:

一.新建一个接口类 using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary> /// InterF 的摘要说明 /// </summary> public class InterF { public interface hide { string show(); } public interface display { string show(

显式intent和隐式intent

android其中显式intent和隐式intent的差别 定义: Intent定义:Intent是一种在不同组件之间传递的请求消息.是应用程序发出的请求和意图. 作为一个完整的消息传递机制,Intent不仅须要发送端,还须要接收端. 显式Intent定义:对于明白指出了目标组件名称的Intent.我们称之为显式Intent. 隐式Intent定义:对于没有明白指出目标组件名称的Intent.则称之为隐式Intent. 显示Intent直接指明了被启动的的类的定义 比方一个实例: Mainact

(java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java.util.Set;import java.util.concurrent.TimeUnit; import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.openqa.selenium.By;import org.openqa.

Android-----Intent中通过startActivity(Intent intent )隐式启动新的Activity

显式Intent我已经简单使用过了,也介绍过概念,现在来说一说隐式Intent: 隐式Intent:就是只在Intent中设置要进行的动作,可以用setAction()和setData()来填入要执行的动作和数据,然后再用startActivity()启动合适的程序. 此外:如果手机中有多个适合的程序,还会弹出列表供用户选择(假如你手机有两个浏览器,你打开一个连接,这是系统就会弹出两个浏览器列表供你选择) 在此举个使用隐式Intent打开activity的快速拨号例子: xml布局文件代码如下: