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我个人有点难过,因为还没有人找到我的复活节彩蛋: