【问题标题】:Passing an Object as an Interface将对象作为接口传递
【发布时间】:2011-02-23 23:32:04
【问题描述】:

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

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);

【问题讨论】:

    标签: delphi interface delphi-7


    【解决方案1】:

    为什么需要投射?

    如果 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.
    

    【讨论】:

    • 谢谢。在我尝试过的所有事情中,我不敢相信我不只是尝试传递对象。
    【解决方案2】:

    是的,你可以。 as 操作符自从对接口的支持被添加到语言中(Delphi 3,IIRC 左右)就开始使用接口。您发布的代码有效。问题出在哪里?

    【讨论】:

    • 当然,还有一个问题,你为什么要这么做。请注意,这意味着保留对接口和对象实例的引用,这可能很棘手:当实例的引用计数降至 0 时,实例通常会被释放,此时您的实例引用不再有效。只保留指向接口的指针或指向实例的指针更容易,而不是两者都保留。
    【解决方案3】:

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

    【讨论】:

    • 不是反过来吗?没有 IInterfaceComponentReference 解决方法吗?
    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 2010-12-02
    • 2015-12-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多