10. 为什么使用接口编程{转载}
进行接口的介绍,必须介绍一下程序语言发展的历史才行,鲁迅先生说过“治学先治史”,明白了程序语言发展的前世今生,才能知道为什么这么多语言为什么会这样,为什么么会那样?
计算机出现以后,科学家相继开发了多种语言,从smalltalk,Pascal,Basic,C语言,C++,java,.net等等,这些语言的发展步伐,可以看作是从面向过程向面向对象发展的一段历史。很多面向对象的书在介绍自己的历史的时候,都会给读者介绍这一段历史,并鼓吹OO编程是多么多么的优异。问题是,很多刚开始学程序的人根本不知道为什么要有这个转变,他们也很难理解OO语言中的虚函数,接口等概念到底为了什么而提出来。
我们在了解这一段历史以前,首先给大家介绍一个概念??“粒度”,什么是粒度?作者认为所谓粒度其实就是一个程序中使用代码单元的组合尺度,我们可以举一个例子,沙砾??砖块??房屋模板,我们设想去修建一座房子,其实有很多中修筑方法,如果你不闲麻烦,可以使用沙砾一点点地建筑,或者将沙砾烧制为砖块,用砖块来砌,甚至直接从工厂购买房屋的门,窗,墙组件来堆砌。这三种不同的方法代表了三种不同的组合尺度。沙砾是最小的单位,使用它搭建小的房子说不定还可以,但是毫无疑问,我们必须使用很多很多“沙砾”,不便于管理;砖块比沙砾聚合了一层,可以用来修建较大的房子了;房屋模板是最高的尺寸,使用它可以快速地搭建大规模的房屋。这三种尺度的区别和联系,与我们编写程序概念是有很大的相似之处的。
在早期学习Pascal,老师告诉我们这种面向过程语言的最基本的单元是过程和函数,它们是程序中的最小的组件。过程和函数可以实现最基本的代码重用,当我们把某些固定功能的代码使用过程和函数编写后,我们可以在程序中调用它们而不必在任何需要的地方都写上这样一段代码,这样的好处是显而易见的。在一些小型的程序里面,使用过程和函数是合适的,但是在大中型程序中,它们的弊端就显示出来,过程和函数的粒度太低了,如果我们一个系统,有10000个函数和过程,我们的程序员将不得不花费大量的时间去寻找和维护它们,10000个没有任何关系的函数和过程的管理难度是显而易见的,就好像10000个人的企业一样,如果没有部门和职务,这还不乱了套?!
面向对象语言的出现,就是为了解决这个问题,别听OO语言吹的天花乱坠,其实它出现就为一个理由??提高编程的粒度。面向对象语言的基本单位是类 CLASS,类封装了很多数据成员和成员函数,过程,将最小组件的提高了一个等级,我们需要直接操作的不是过程和函数了,而是一个个更高层次上的类。我们把10000人分了很多部门,不同的部门负责不同的事宜,这样公司终于可以走上正轨了。
做成了类CLASS是否就万事大吉了呢?不一定,新的问题随之而来,也许我们有一个部门的人很多,可以做很多事情,如何在部门内部实现更好的管理呢?好比我们有一个类,它提供了很多种方法和属性,这些方法和属性其实可以分为一堆堆,为不同的功能服务,但是我们的类并没有做这个管理。在AO种,map对象拥有很多功能,比如管理图层,管理元素,管理选择集,进行地图显示,每种不同的功能都有好多方法和属性,现在这些属性和方法是杂乱无章,没有任何区别堆积在一个类里面的,当我们的程序员需要寻找一个方法的时候,不得不一个个去寻找,很不方便。
这个时候,接口interface出现了,C++的发明者第一次提出纯虚函数(其实就是接口)概念的时候,遭到了很多抵制,很多人都不明白接口的意义何在,我们用虚函数好好的,何必又出来个啥东西都没有的空架子?说它是类吧,又不能实现产生一个对象;说它是对象吧,又没有方法体来使用。接口出来干了一件好事,就是将类内部进行分类。对于map对象,我们可以做好几个接口,这些接口中定义不同功能的方法,函数和属性,map类实现这些接口,这样我们可以使用接口定义,实现对象。因此,所谓接口就是一系列相关方法与属性集合的定义。
Dim pGraphicsContainer as iGraphicsContainer
pGraphicsContainer=application.document.ActiveView.focusMap
pGraphicsContainer可以使用的属性和方法就只能是它定义的那部分了,而不能使用管理元素等的接口定义的方法和属性,那我们如何使用其它的功能呢?这就是所谓的QI(Query Interface)功能。从一个接口查询另一个接口。
Dim pGeoFeatureLayer as iGeofeatureLayer
pGeoFeatureLayer= pGraphicsContainer QI
好了,我们罗嗦了这么多,已经走进了COM的概念了,在正式介绍COM以前我们得最后罗嗦一点:计算机语言的发展历史,其实就是一部不断提高组件粒度的历史,不断提高代码重用的历史。以前我们使用过程和函数,后来我们使用类,现在我们使用接口,都是为了一个目的,让我们操作的组件在具体和抽象之间寻找一个平衡点。太具体了,如过程和函数,就没有了框架;太抽象,如类,就无法分别。
一个代码示例:
public interface IForm
{
void Show();
void ShowDialog();
}
public class A:IForm
{
public void Show()
{
}
public void ShowDialog()
{
}
}
public class B:IForm
{
public void Show()
{
}
public void ShowDialog()
{
}
}
public class FormFactory
{
public static IForm CreateInstance(string parm)
{
if (parm == "A")
{
return new A();
else if (parm == "B")
return new B();
}
return null;
}
}
这是逻辑的抽象
这是方法的具体
这就是编写程序的哲学.
分享到:
相关推荐
VC与matlab接口编程(转) - 喜欢上了云的日志 - 网易博客.mht
标题中的“用Delphi进行TWAIN编程”是指利用Delphi集成开发环境,通过TWAIN接口来控制扫描仪或摄像头进行图像数据的获取。TWAIN是一个跨平台的数据传输标准,主要应用于图像输入设备如扫描仪和摄像头,使得应用程序...
Java编程事项是一个涵盖广泛的主题,它包含了众多关于Java语言编程的最佳实践、常见陷阱以及高效编程技巧。这篇由多个来源整理转贴的资料,以.htm格式呈现,旨在帮助开发者提升编程技能,避免常见错误,理解Java的...
- `protocol` 参数通常设置为 `0`,表示使用默认协议。 2. **绑定端口** ```c int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); ``` - `sockfd` 是通过 `socket()` 函数获取的Socket...
《月影短信》免费编程接口(DLL): §DLL文件大小不足250K,却包含了手机短信息发送、电子邮件特快专递、网络拨号管理、http下载等编程接口。 §单一的DLL文件,体积小巧,不需要附加任何控件或者运行支持库。 ...
Windows API(Application Programming Interface,应用程序编程接口)是Microsoft Windows操作系统的核心编程接口。它为开发者提供了与系统交互的各种功能,包括窗口管理、绘图操作、文件处理等。本文将深入探讨...
10. **网络库**:为了简化网络编程,有许多优秀的C++库可供使用,如Boost.Asio、Poco库、Qt网络模块等,它们提供了高级接口,减少了底层细节的处理。 QQ示例源码作为学习材料,可能会涵盖以上部分或全部知识点,...
总的来说,OpenGL编程指南(原书第7版)为程序员提供了一个全面的OpenGL学习路径,涵盖了从基础到高级的广泛主题,通过大量的代码示例和清晰的讲解,帮助读者快速掌握OpenGL的使用和计算机图形学的知识。对于想要...
然而,具体的功能和实现细节,如编程语言、依赖库、接口设计等,需要通过查看源代码或相关文档才能深入了解。同时,使用这样的工具应遵守相关法律法规,尊重原作者的知识产权,确保不会影响正常的工作秩序。
11. 为什么使用接口编程{转载} 23 12. ArcEngine中闪烁目标 26 13. 创建多个ArcSDE实例 29 14. Geometry 对象浅析 30 15. 空间查询与空间分析功能 36 16. AO中的空间关系 38 17. ArcGIS Engine 中的相交分析的实现 ...
11. 为什么使用接口编程{转载} 23 12. ArcEngine中闪烁目标 26 13. 创建多个ArcSDE实例 29 14. Geometry 对象浅析 30 15. 空间查询与空间分析功能 36 16. AO中的空间关系 38 17. ArcGIS Engine 中的相交分析的实现 ...
Linux Shell编程是Linux系统中非常重要的一个环节,它允许用户通过命令行接口执行各种操作,进行自动化任务处理。shell作为用户与操作系统之间的桥梁,提供了一系列强大的功能,包括脚本编写、文件管理、进程控制等...
在IT领域,网络编程是构建分布式系统的基础,而Socket编程是网络编程的核心部分。本文将深入探讨标题和描述中提到的“多线程阻塞式网络编程socket”相关的知识点。 首先,我们需要理解“socket”。Socket是操作系统...
套接字是应用程序与网络协议栈之间的接口,它为程序员提供了底层网络通信的能力。在本文中,我们将深入探讨如何实现两台计算机之间的套接字通信,包括服务端和客户端的源码实现。 首先,我们需要理解套接字的工作...
9. **泛型**:理解泛型的概念,知道如何使用泛型类、接口和方法,以增强代码的类型安全性和重用性。 10. **设计模式**:习题可能涉及到一些常见的设计模式,如单例、工厂、观察者、装饰器等,设计模式是解决常见...
标题"VC socket传送文件的例子(转载)"揭示了我们将讨论如何使用Visual C++(简称VC)通过Socket接口来实现文件的发送与接收。 首先,Socket是网络编程的基本组件,它提供了进程间通信(IPC)的接口,使得运行在...
6. **编程接口**:在编程中,通常需要使用特定的API或库来操作串口,如Windows的`CreateFile`、`WriteFile`、`ReadFile`函数,或者Linux的`open`、`write`、`read`等系统调用。 7. **编程语言支持**:各种编程语言...
由于没有OS,一些常见的编程便利性,如C库,通常无法直接使用。 C库是C语言编程时必不可少的一部分,它包含了众多的函数,如数学运算、字符串处理、输入/输出操作等。对于ARM裸奔程序来说,最常用的C库之一是Newlib...
《UNIX高级编程》是Linux编程领域的一本经典之作,它主要涵盖了UNIX系统中高级编程的各种技术和实践。...通过学习本书,读者可以提升对UNIX/Linux系统的理解和编程能力,为开发复杂的应用程序打下坚实的基础。