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

Delphi 对象和引用之间的区别是什么?,delphi,Delphi,两者的区别是什么 TFuncOfIntToString = reference to function(x: Integer): string; 及 我使用对象第一个,第二个是普通的.< /p> 让我们考虑以下三种类型的声明: TProcedure = procedure; TMethod = procedure of object; TAnonMethod = reference to procedure; 这些都非常相似。就这三种类型的调用实例而言,调用代码是相同的。不同之处在于可以为

两者的区别是什么

TFuncOfIntToString = reference to function(x: Integer): string; 


我使用对象

第一个,第二个是普通的.< /p> 让我们考虑以下三种类型的声明:

TProcedure = procedure;
TMethod = procedure of object;
TAnonMethod = reference to procedure;
这些都非常相似。就这三种类型的调用实例而言,调用代码是相同的。不同之处在于可以为这些类型的变量分配什么

程序类型

t过程
是一个复杂的过程。您可以将以下形式的内容分配给
TProcedure
类型的变量:

procedure MyProcedure;
begin
end;
这是一个非面向对象的过程。不能将实例或类方法分配给
TProcedure
变量。但是,您可以为
TProcedure
变量指定一个变量

方法指针

t方法
是一种有效的方法。这由对象的
表示。当您有类型为
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();
    
    匿名方法

    最后我们来谈谈。它们甚至比过程类型和方法指针更通用。您可以将以下任一项分配给使用
    引用到
    语法定义的变量:

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

    var
      AnonMethod: TAnonMethod;
    ....
    AnonMethod := MyProcedure;            // item 1 above
    AnonMethod := instance1.MyMethod;     // item 2
    AnonMethod := TMyClass.MyClassMethod; // item 3
    
    var
      AnonMethod: TAnonMethod;
    ....
    AnonMethod := procedure
      begin
        DoSomething;
      end;
    
    上面第4项中的匿名方法是在代码中内联声明的方法。例如:

    var
      AnonMethod: TAnonMethod;
    ....
    AnonMethod := MyProcedure;            // item 1 above
    AnonMethod := instance1.MyMethod;     // item 2
    AnonMethod := TMyClass.MyClassMethod; // item 3
    
    var
      AnonMethod: TAnonMethod;
    ....
    AnonMethod := procedure
      begin
        DoSomething;
      end;
    
    与过程类型和方法指针相比,匿名方法的最大好处是它们允许。例如,考虑下面的短程序来说明:

    {$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 12 -84
    为什么在我追根究底之前我就知道是你?@Marjannema可能是因为David是为数不多的几个给出巨大解释的人之一,基本上是Delphi标签的组成部分,所以(:@Computersays不太好,谢谢,但我不完全同意你说的“很少”.我想这里有很多积极的德尔福回答者,所以他们的回答都有很好的解释。我不想点名,但我们这些活跃在这里的人都知道他们是谁。我们都应该通过投票来鼓励他们的回答有解释。这是一个非常非常好的回答。谢谢@Nick,尽管我对伟大没有把握。P我个人有点难过,因为还没有人找到我的复活节彩蛋: