将对象作为接口传递

时间:2010-05-26 01:55:32

标签: delphi interface delphi-7

这应该是一个简单的答案,我相信它会成为一个不, 但是从一个更大的项目中获取,我有一个界面和程序

iMyUnknown= interface(IInterface)
 ['..GUID..']
end;
procedure WorkObject(iObj :iMyUnknown);

我知道这有效

var 
  MyUnknown : iMyUnknown;
begin
 if supports(obj, iMyUnknown, MyUnknown) then
  WorkObject(MyUnknown);

但是可以这样做吗?

if supports(obj, iMyUnknown) then
  WorkObject(obj as iMyUnknown);

3 个答案:

答案 0 :(得分:5)

你为什么要演员?

如果obj支持该接口,那么您需要做的就是在将其传递给过程之前检查它,您可以简单地传递该对象本身。编译器将负责其余的工作。如果要访问接口的方法,则只需要Supports调用上的第三个参数。

编译并运行以下代码。它应该编译没有错误,并为您提供一个控制台窗口和一个对话框消息。

program Project1;

{$APPTYPE CONSOLE}

uses
  Classes
  , Dialogs
  , SysUtils
  ;

type
  iMyUnknown = interface(IInterface)
  ['{DA867EBA-8213-4A91-8E03-1AACA150CE77}']
    procedure DoSomething;
  end;

  TMuster = class(TInterfacedObject, iMyUnknown)
    procedure DoSomething;
  end;

procedure WorkObject(iObj: iMyUnknown);
begin
  if Assigned(iObj) then ShowMessage('Got something');
end;

{ TMuster }

procedure TMuster.DoSomething;
begin
  beep;
end;

var
  obj: TMuster;
begin
  try
    obj := TMuster.Create;
    if Supports(obj, iMyUnknown) then
      WorkObject(obj);
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

答案 1 :(得分:3)

只要编译器知道您的对象支持IInterface,并且您的接口具有GUID,您就可以将对象强制转换为带有as-cast的接口。因此它不适用于TObject,但使用TInterfacedObject它将会。

答案 2 :(得分:3)

是的,你可以。自从对语言添加了对接口的支持以来,as运算符一直使用接口(Delphi 3,IIRC)。您发布的代码有效。问题在哪里?