.NET简谈接口
自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程、面向接口编程、面向组件编程等等;这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合。
今天我要简谈的是面向对象里面非常重要的也是非常抽象的概念,接口。谈起接口多少人曾经为之痛苦过,尤其是一些刚入门的开发人员(包括小弟),百思不得其解,啥叫接口,接口能干嘛用,用不用有什么区别;等等问题困扰着,这些问题不解决不弄明白,很难在面向对象领域混,更别谈面向对象开发了,可能有人认为面向对象开发就是麻烦我不用一样也能开发,开发一个项目又是分这个层,又是分那个层的,繁琐。这中情况我就没有权利去发表任何意见了。仁者见仁智者见智吧;
接口是面向对象里面非常重要的概念,我们暂且不谈面向对象里面的接口;其实接口在我们日常生活中到处可见,比如自来水的水管、燃气阀门、电视机的插头等等;在面向对象里面的接口概念其实跟这些都是大同小异的。为什么要提倡进行面向对象软件开发呢,我想就是将我们开发的方式完全能模仿自然界的生存规律,在没有彻底理解面向对象里面的接口时,请注意千万不要自己欺骗自己,简单的自已打个比方就OK了(别人这么说,我也这么想一下),这些问题一定要搞清楚,本人有过成功理解面向接口的经验,希望通过本文章能帮助您小理解一下;后面的升华(面向对象设计、面向接口设计等等),还得靠自己去摸索。我们再来看一下,在我们计算机里面存在哪些接口,比如我们的硬件与OS的接口,硬件存在的数量数不胜数,各种各样,要想完全能与OS对接,能让我们的软件使用,必须遵循一定的接口,在我们的OS与硬件之间存在着一层,硬件抽象层;
请看图:

什么叫硬件抽象层:硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化;目的就是使用这一层来抽象化所有的硬件接口,对上层使用统一的接口调用;根本不需要关注有哪些硬件,只要大家都遵循一致的接口就能互相通讯,互相调用;有一位大师曾经说过:在计算机科学领域里任何一个问题都能通过添加一个间接层来解决;这里的接口是一个比较大的开发思想,但是它与代码中的接口概念是完全一样的,都是提高抽象性,提高独立性;
我们回到开发代码中来,我就拿.NET来示范了(本人只会C#),在某一个编程语言里面的接口其实就和上面的硬件接口层是一个意思,我们拿一个例子来说吧,我就奉献我认为最能说明接口问题的例子,这个例子一直伴随着本人理解到现在,每当我有问题时,我就利用这个例子来打比方,其实很简单的一个例子,就是完全模仿现实生活中的场景,也是面向对象所最求的精髓;都说演员要感受生活才能演好戏,我们程序员也要感受生活才能写出好的程序;(开个玩笑)
例子:假如我是一家生产水管公司的老板,我要生产所有能被家庭、工厂、企业使用的水管;要想生产这些水管,就必须要知道这些水管能与家庭、工厂、企业进行对接的条件,家庭、工厂、企业都使用些什么规格、型号的水管;这些东西那里来,找啊;注意这里就形成了第一个接口,各厂家的水管规格、型号说明书,这个说明书就是我们这里的接口;知道了各个生产厂商的水管的规格、型号说明书,我就知道怎么与之对接了;
请看图:

各个厂商都公布了自己公司生产的商品的一系列说明性信息,只要我们找到了这些信息就可以生产了;我们把图转换成C#代码,请看图:

在我们解决方案中有三家厂商公布了说明书,内容是,请看图:

我这里就给出一个属性,水管的半径;在接口里面不得有任何的实现代码,只能是申明要实现的代码;让要实现的对象去完成;这个接口的作用就是当我生产的水管与厂商的水管进行对接时,要去读取的属性标识;记住,接口是实现的定义,是一种规则,一种描述,不不包括实现代码;
有了说明书我要回去生产了,请看图:

代码图请看:

在项目里面多了一个本公司的项目,我们引用生产商1,然后实现规格说明书接口,请看图:

实现了接口,就可以与生产商1的产品进行对接了;记住,任何一个公开的接口,接口里面的东西都是公开方必须要使用到的东西,必须实现;仔细想想我们生活中,当一个水阀门没有开关时,那是多可怕的;下面实现对接,请看图:

任何接口的实现在最后都会被调用,所以这是接口的本质,它将实现的规格对外公开,让大家去实现,只要遵循接口就等于它自己的实现;面向对象编程的最高境界就是面向接口编程,接口就好比一个工程的工程图纸,只要将图纸给包工头,让他去实施就OK了;请看代码图:

接口就讲完了,简简单单的代码希望您能看的懂;最后我们总结一句:
接口就好比我们自然界中的说明文档,而实现就是我们依照说明文当生产出来的能使用的实体,接口是一切事物的抽象定义,一切事物的抽象描述;
.NET简谈接口的更多相关文章
- .NET简谈——跨进高级编程门槛的必经之路
我们继续C#基础知识的学习,这篇文章对前面基础知识学习的朋友有着举足轻重的作用:为了延续基础知识学习的热情,我编写了这篇特殊的文章. 本篇文章的中心是想借“.NET简谈反射(动态调用)”一文继续发挥下 ...
- .NET简谈构件系统开发模式
转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...
- 简谈Java语言的封装
简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...
- MPI简谈
MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...
- 简谈Java语言的继承
Java语言的继承 这里简谈Java语言的三大特性之二——继承. Java语言的三大特性是循序渐进的.是有顺序性的,应该按照封装-->继承-->多态这样的顺序依次学习 继承的定义 百度百科 ...
- 简谈HTML5与APP技术应用
HTML5到底能给企业带来些什么? HTML5是近年来互联网行业的热门词汇,火的很.微软IE产品总经理发文: 未来的网络属于HTML5.乔布斯生前也在公开信<Flash之我见>中预言:像H ...
- DDD-领域驱动设计简谈
看到网上讨论 DDD 的文章越来越多,咱也不能甘于人后啊,以下是我对 DDD 的个人理解,短小精悍,不喜忽喷. 也谈DDD(领域驱动设计) 解决什么问题 传统模式,产品评审结束,开发人员就凭经验拆分模 ...
- Hibernate入门与简谈
Hibernate jdbc Java Databases Connectivity, 他是提供了一组Java API来访问关系数据库的Java程序.这些Java API 可以使Java应用程序执行S ...
- 简谈ashx
是一般处理程序, 是asp.net web 组件的一种,ashx是其扩展名. 实现IHttpHandler接口,接收并处理http请求.这个接口有一个IsReusable成员,一个待实现的方法Proc ...
随机推荐
- ExtJs 实现表单联动
最近做的项目使用Extjs.遇到表单联动的业务.下面来说说主要实现思想: 说明:表单联动一般存在从属关系,有大范围的对象和大范围中的小对象.比如地理位置的选定(例:浙江省-杭州市-某某县).在这里,我 ...
- CentOS 7 上安装 redis3.2.3安装与配置
前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自身集群的功能. 而现在最新的项目是需要redis集群的,这篇文章我们就来介绍下有关redis的安装与配置. 一. ...
- ThinkPhP 分页
<?php namespace User\Service; use Think\Controller; use Think\Exception; class UserService { // 每 ...
- IBatis 2.x 和 MyBatis 3.0.x 的区别(从 iBatis 到 MyBatis)
从 iBatis 到 MyBatis,你准备好了吗? 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate.JPA 这样的一站式对象 / 关系 ...
- Android高手速成--第四部分 开发工具及测试工具
第四部分 开发工具及测试工具 主要介绍和Android开发工具和测试工具相关的开源项目. 一.开发效率工具 Json2Java根据JSon数据自动生成对应的Java实体类,还支持Parcel.Gson ...
- svn 版本转为git
git clone 相当于git init 和 git svn fetch.git svn rease git svn fetch 从svn服务器取指定区间的版本转化成git库 git svn reb ...
- PHP数组函数: array_map()
定义和用法 array_map() 函数返回用户自定义函数作用后的数组.回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致. 语法 array_map(function,a ...
- 读取70开头的xml,gbk转成utf-8
//读取70开头的xml,gbk转成utf-8 //InputStream is = new FileInputStream(super.getFile());//文件读取 //InputStream ...
- dataTables 使用小细节
1.dataTables 日期查询 var row_content = []; //暂存表格的行内容 var rows=[]; //暂存表格行索引 /**将日期缓存添加,清除上一次日期搜索的缓存*/ ...
- bzoj3551 Peaks加强版
这个题--感觉离线和在线的代码难度差不多(pb_ds不要说话). 离线的话,就是把所有询问按照w排个序,然后一边Kruskal+平衡树启发式合并一边回答询问就好了. 在线也不难写.首先Kruskal重 ...