1。1 定义接口
接口概念:接口只不过是接口实现者和使用者之间的协议。定义接口,实际上是在说:“我看到了这个功能的必要。我承认该功能可以用许多不同方式来实现。我真的不在乎该功能是如何实现的,但是最好坚持这些规定。”接口用户可以往接口规定上编码,而不必担心规定会改变。
接口的定义:
接口有如下特征:
1)接口被声明为interface类型,不是CLASS类型。接口名以字母I开始。
2)所有的接口都从IUnKnown直接或间接继承。并且IUnKnown是COM中所有接口的基础。
3)不能创建接口实例如以下代码是非法的
var MyNumber:IFormattedNumber;
begin
MyNumber:=IFormattedNumber.Create;//非法
end;
4)不能在接口中指定范围指示。接口定义的所有方法都是公有型(PUBLIC)。PUBLIC也不能在接口声明中包括。
5)接口不能声明变量。
6)接口中声明的所有函数和过程,概念上讲都是虚抽象函数和过程。声明时不必带Virtual关键字。
1。1。2 接口是不变的
定义并公布接口之后,就固定成型,不能修改那个接口了。如果需要增强接口,可以发表新“版本”的接口。如果新接口所做的就是添加一个新的类似的接口,那么可以从类似的接口中派生出来。
如下代码:
1.2声明接口
全球唯一标识符GUID,所有的COM接口以及某些只在自己的应用程序内部使用的接口,需要唯一的GUID才能正常运行(CTRL+SHIFT+G)在内部,DELPHI调用WINAPI函数CoCreateGuid来产生GUID。代码如下:
声明接口是创建一个有用的接口的前半部分。声明接口之后。仍然需要给出接口的实现。
1。3实现接口
因为不能创建接口的实例。那么如何使用接口:创建实现接口的类。如:
以上代码编译的时候会出现错误信息。接下来将学习IUnKnown.
1.3.1实现IUnKnown
QueryInterface:是请求指向一个接口指针的函数。如果接口是由问题中的对象实现的,QueryInterface返回在Obj参数中的接口,且返回数值为0。如果接口不是由对象实现的,QueryInterface返回Microsoft定义的常量E_NOINTERFACE.
_AddRef
接口是引用计数。因些在对象中当获得接口指针时,对象被引用的次数就增加了。当结束使用接口时,对象的引用次数就下降了。当引用次数到达零时,就自动销毁对象。_AddRef是负责增大引用计数的函数。
_Release
负责降低引用计数的函数。当引用计数达到零时,就自动销毁对象。