代码之家  ›  专栏  ›  技术社区  ›  Kenneth Cochran

在Delphi中使用接口需要guid吗?

  •  19
  • Kenneth Cochran  · 技术社区  · 16 年前

    官方文件说它们是可选的。我知道COM互操作要求每个接口都有一个唯一的标识符,但是我看到的每个接口示例都有一个GUID,不管它是否与COM一起使用?如果不与COM一起使用,那么包含一个guid有什么好处吗?

    2 回复  |  直到 16 年前
        1
  •  19
  •   Senseful    16 年前

    我注意到一些方法,如 Supports (确定类是否符合特定接口)需要先定义一个guid,然后才能使用它们。

    This page 用以下信息确认:

    注意:sysutils单元提供 超载 调用的函数支持 在类中返回真或假 类型和实例支持 由表示的特定接口 GUID。 支持功能用于 Delphi的方式是 运算符。显著性差异 是否支持功能可以 作为右操作数 GUID或 与关联的接口类型 GUID ,鉴于“是”和“是”取其名称 一种类型的有关的详细信息 是和是,请参见类引用。

    这里有一些 interesting information about interfaces ,这说明:

    为什么界面需要 唯一可识别?答案是 简单:因为Delphi类可以 实现多个接口。当一个 应用程序正在运行,必须 是一种获取指针的机制 到适当的接口 实施。 唯一能找到的方法 如果对象实现了 接口和获取指向 该接口的实现是 穿越GUIDs .

    两个引号中都添加了强调。

    阅读这整篇文章也会让你意识到 QueryInterface (需要一个guid)在后台使用,原因包括引用计数。

        2
  •  7
  •   Ondrej Kelle    16 年前

    只有当你需要你的界面 compatible with COM .

    不幸的是,这还包括使用 is , as 运算符和 QueryInterface , Supports 功能——缺乏功能是相当有限的。因此,虽然不是严格要求,但使用guid可能更容易。否则,您只剩下相当简单的用法:

    type
      ITest = interface
        procedure Test;
      end;
    
      ITest2 = interface(ITest)
        procedure Test2;
      end;
    
      TTest = class(TInterfacedObject, ITest, ITest2)
      public
        procedure Test;
        procedure Test2;
      end;
    
    procedure TTest.Test;
    begin
      Writeln('Test');
    end;
    
    procedure TTest.Test2;
    begin
      Writeln('Test2');
    end;
    
    procedure DoTest(const Test: ITest);
    begin
      Test.Test;
    end;
    
    procedure DoTest2(const Test: ITest2);
    begin
      Test.Test;
      Test.Test2;
    end;
    
    procedure Main;
    var
      Test: ITest;
      Test2: ITest2;
    begin
      Test := TTest.Create;
      DoTest(Test);
      Test := nil;
    
      Test2 := TTest.Create;
      DoTest(Test2);
      DoTest2(Test2);
    end;
    
    推荐文章