声明接口
IMyInterface = interface(IInterface)
['{63E072DF-B81E-4734-B3CB-3C23C7FDA8EA}']
function GetName(const str: String): String; stdcall;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall; //使接口引用数加1。
function _Release: Integer; stdcall; //使接口引用数减1,当小于等于0时作释放动作。
end;
说明:如果有继续关系则在括号里填父接口,否则省却,如:IMyInterface = interface这样就行。
说明:GUID可选,如要实现具有COM特性的接口则需要加上
zc:接口GUID,最好加上,最好分离功能及其封装。
接口中所有的数据成员都是public访问限制,数据成员指定其为不能私有或其他的域成员。
接口中的方法只能有声明,看上去像没有构造和析构方法的纯虚类。
type
IInterface = interface
['']
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
该接口实现了QueryInterface,_AddRef,_Release,凡是继承于该接口,则不需要声明
该三个虚函数。
在实现新接口的类中,也要从TInterfacedObject 后继承,原因在于该类实现以上函数的
实现部分,不要考虑QueryInterface等完成。如下:
type
TNewInterfaceClass = class(TInterfacedObject, INewInterface)
...
end;
接口的实现
接口服务是由类来实现的。
TIntfClass = class(TObject, IMyInterface)
private
FCounter: Integer;
FRefCount: Integer;
public
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
...
end;
获取接口
a. 使用类型转换。
如:var aIntf: IMyInterface;
begin
aObj := TIntfClass.Create;
try
aIntf := (IMyInterface(aObj);
...
b. 利用Delphi编译器内建机制。 如:aIntf := aObj。
c. 利用对象的QueryInterface方法。
如
OleCheck(aObj.QueryInterface(IID, aIntf)); 只能存取有GUID的COM接口。
d. 利用as操作符。
使用as操作符必须符合下面条件:
1.接口要从IInterface接口继承下来。
2.有GUID值
在Delphi7中接口的实现类还必须是从TInterfacedObject继承下来才行,
如 TIntfClass = class(TInterfacedObject, IMyInterface)
zc: 最好用该方法,考虑使用接口有其他语言开发l情况下的使用。
接口和对象生命期
对接口直接=nil即可,freeAndNil则不需要。因接口特性,会计数减少1
接口的委托(Interface Delegation)
分为两种:
1. 对象接口委托
2. 类对象委托。
(略)