Delphi(特别是6)中对接口进行了扩展,不再仅仅是兼容COM那套,
但实际使用中,绝大多数的接口操作函数,如Support等都需要
GUID才能使用,例如
type
INoGuid = interface
['{D722C064-43DE-4F1C-9A05-B8B6722D9788}']
procedure Hello;
end;
IOther = interface
['{9D49D575-03B5-485C-8B55-8989C01BAF5B}']
end;
TNoGuid = class(TInterfacedObject, INoGuid, IOther)
public
procedure Hello;
end;
{ TNoGuid }
procedure TNoGuid.Hello;
begin
ShowMessage('Hello World!');
end;
procedure TForm1.Button5Click(Sender: TObject);
var
spNoGuid: INoGuid;
spOther: IOther;
begin
spNoGuid := TNoGuid.Create
// INoGuid无需IID
spNoGuid.Hello;
spOther := TNoGuid.Create
// IOther无需IID
spNoGuid := spOther as INoGuid
// IOther无需IID, INoGuid需要IID
spNoGuid.Hello;
end;
直接使用接口INoGuid时,你不定义INoGuid的IID也是可以的,
但如果你使用一些接口的维护函数,如as关键字、Support函数等等
这是你的IID就必须定义,如spNoGuid := spOther as INoGuid;
一行,如果你没有定义INoGuid的IID则无法编译通过,因为as实际上
使用了_IntfCast函数,而此函数
procedure _IntfCast(var Dest: IInterface
const Source: IInterface
const IID: TGUID);
的参数必须传入IID才行,support等函数类似。
而在这一行你不定义IOther的IID就没有问题,因为你没有使用到
IOther的IID,Delphi在编译时会自动进行检查。