微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 对象和引用之间的区别是什么?

有什么区别
TFuncOfIntToString = reference to function(x: Integer): string;

TFuncOfIntToString = function(x: Integer): string of object;

我使用的对象

解决方法

让我们考虑以下三种类型声明:
TProcedure = procedure;
TMethod = procedure of object;
TAnonMethod = reference to procedure;

这些都是非常相似的。在这三种类型的每一种的调用实例方面,调用代码是相同的。差异出现在可以分配给这些类型的变量。

程序类型

TProcedure是一个procedural type.你可以分配一个类型TProcedure这种形式的变量:

procedure MyProcedure;
begin
end;

这是一个非面向对象的过程。您不能将实例或类方法分配给TProcedure变量。但是,您可以将static class method分配给TProcedure变量。

方法指针

TMethod是一个method pointer.这由对象的存在表示。当有一个TMethod类型的变量时,必须指定:

>实例化对象的实例方法,或
>类方法

所以你可以分配这些:

procedure TMyClass.MyMethod;
begin
end;

class procedure TMyClass.MyClassMethod;
begin
end;

过程类型和方法指针之间的巨大区别在于后者包含对代码和数据的引用。方法指针通常被称为双指针过程类型。一个包含方法指针的变量包含对代码和实例/类的引用。

考虑下面的代码

var
  instance1,instance2: TMyClass;
  method1,method2: TMethod;
....
method1 := instance1.MyMethod;
method2 := instance2.MyMethod;

现在,虽然method1和method2引用同一段代码,但它们与不同的对象实例相关联。所以,如果我们调用

method1();
method2();

我们在两个不同的实例上调用MyMethod。该代码等效于:

instance1.MyMethod();
instance2.MyMethod();

匿名方法

最后我们来到anonymous methods.这些是比过程类型和方法指针更通用的目的。您可以将以下任何一个赋给使用引用语法定义的变量:

>一个简单的非面向对象的过程。
>实例化类的实例方法
>类方法
>匿名方法

例如:

var
  AnonMethod: TAnonMethod;
....
AnonMethod := MyProcedure;            // item 1 above
AnonMethod := instance1.MyMethod;     // item 2
AnonMethod := TMyClass.MyClassMethod; // item 3

匿名方法,上面的第4项,是在代码中声明的内联方法。例如:

var
  AnonMethod: TAnonMethod;
....
AnonMethod := procedure
  begin
    DoSomething;
  end;

与过程类型和方法指针相比,匿名方法的最大好处是它们允许使用variable capture.例如,考虑下面的短程序来说明:

{$APPTYPE CONSOLE}
program VariableCapture;

type
  TMyFunc = reference to function(X: Integer): Integer;

function MakeFunc(Y: Integer): TMyFunc;
begin
  Result := function(X: Integer): Integer
    begin
      Result := X*Y;
    end;
end;

var
  func1,func2: TMyFunc;

begin
  func1 := MakeFunc(3);
  func2 := MakeFunc(-42);
  Writeln(func1(4));
  Writeln(func2(2));
  Readln;
end.

这有以下输出

12
-84

原文地址:https://www.jb51.cc/delphi/103627.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐