1.1 定义接口:
目的:什么是接口,以及和抽象类的关联以及不同点。
抽象类(备注理解接口最简单的方法)
永远不能创建一个抽象类的实例;
本身不能实现功能,依靠派生类实现;
接口
被申明为interface类型。接口名从字母I开始。类类型名从T开始。
所有的接口从IUnknown继承;
不能创建接口实例;
不能在接口中指定范围指示。所有的方法都是公有型(public),不能在接口中申明包括范围指示;
不能申明变量;接口只能决定提供什么样的功能,对于如何完成功能没有限制;
接口中申明的所有函数和过程,概念上都是虚抽象函数和过程;因此申明时不能带Virtual;
接口是不变的;
1.2申明一个接口
目的:如何声明一个接口
常用的接口:CLSID、IID、和LIBID;
GUID(Globally Unique Identifier)全球唯一标示符: CoCreateGuid产生(API);
CLSID(Class Identifier): 代表COM对象的类别,代表COM对象的CoClass;
IID(Interface Identifier): 代表一个COM对象的接口;
例如:如何建立COM对象的方法;
var
iRoot: IUnkown;
begin
...
iRoot := CreateComObject(ProgIDToClassID('Project1.Interface1')); //取得实体样例
...
end;
应用程序在内存中建立了COM对象的实体样例;
注意: CreateComObject回传的是COM对象的实体样例的IUnknown接口;
APPID(Application Indentifier): 应用程序ID;
CATID(Category Identifier): COM组件实现的组件类型;
LIBID(Library Identifier): COM对象实现的Type Library代表的ID;
ProgID: 有意义的字符串代表特定的CLSID;
1.3 实现接口
目的:如何实现接口
实现IUnknown: QueryInterface、 _AddRef、 _Release
使用TInterfaceObject来自动实现Iunknown,否则的话自己要实现上面的方法。
创建、使用及销毁接口: create;指向接口的指针不访问任何信息;自动释放、强迫销毁一个接口将变量置为nil
注:delphi自动创建和销毁接口。
获取单个接口的指针:
直接分配:类与他们实现的接口类型兼容的
GetInterface(const IID: TGUID; out obj):判断对象是否支持一个接口
as操作符: 对象支持特定的接口(对象不支持接口就错的话,可以拦截错误);
as自动调用计数功能;
1.4 高级多级接口问题
目的:在一个类中实现多个接口
在一个类中实现多个接口
TXY = class(TInterfacedObject, IXX, IYY): 类TXY 实现了IXX和IYY接口的所有方法。
多个接口不是多重继承:TXY有且只有一个基类TInterfacedObject;
方法分辨字句:当接口方法在类中实现时,方法分辨子句可使用改变他的名称
TXY = class(TInterfacedObject, IXX, IYY)
procedure IXX.pxy = pxy1
procedure IYY.pxy = pxy2
接口授权:一个接口的实现授权给另一个类:一个类包含针对另一个类的指针。
内部类: 实现一个或多个接口的功能性;
外部类: 简单的将这些方法传递给内部类,而不是重新实现接口;
接口属性:可以定义只读、只写、或者读写属性;
但是所有访问都必须通过访问函数,因为接口不能定义存储。
1.5 小结
目的:如何在delphi应用程序中内部使用接口,了解delphi语言要素的接口。
申明一个接口;
在类中实现接口;
实现IUnknown所需要的功能;
自动对象析构的处理;
在类中实现多个接口;
将一个接口的实现授权给一个内部对象;
定义并实现接口属性
[第一章 接口][第二章 接口与COM][第三章 类型库][第四章 自动化][第五章 ActiveX][末尾]
第二章 接口与COM
2.1 GUIDs 和 COM