Delphi中构造函数约束的用例是什么



标题几乎是...

为什么要使用constructor约束?

class约束显然暗示了它。

如果您单独使用它,则无法对创建的东西做任何事情。

为什么它甚至存在?

附加信息:

注意,在添加"构造函数"约束之前,以下代码不会编译:

program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils;

type
  TSomeClass<T: class> = class
    function GetType: T;
  end;

{ TSomeClass<T> }
function TSomeClass<T>.GetType: T;
begin
  Result := T.Create;
end;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

为什么要使用构造函数约束?

class Constrint显然暗示了。

不,不是。构造函数约束要求该类型具有公共无参数构造函数 - 然后允许调用该构造函数。

并非所有类都有公共参数构造函数。

以imho的官方原因是编译器实际上无法自己处理。

这只是编译器的标志,也可以由他自己设置,因为编译器确实认识到我们需要一个构造函数约束的事实。因此,可以由编译器自动处理它,因为使用该类之前将编译通用类。

也许我们会用xe9

获得它

更新

如果将tcomponent接受为没有公共参数无参数构造函数的类类型,则构造函数约束是没有用的,因为此(来自nick的扩展样本)编译并产生了tcomponent实例。当然,它不会调用原始构造函数tcomponent.create(aowner:tcomponent),而是调用tobject.create,但您有一个tcomponent实例。

program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils, System.Classes;
type
  TSomeClass<T: class, constructor> = class
    function GetType: T;
  end;
{ TSomeClass<T> }
function TSomeClass<T>.GetType: T;
begin
  Result := T.Create;
end;
var
  SomeClass : TSomeClass<TComponent>;
  Component : TComponent;
begin
  try
    SomeClass := TSomeClass<TComponent>.Create;
    Component := SomeClass.GetType;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

更新

TSomeClass<T: class, constructor>

具有与

相同的含义
TSomeClass<T: constructor>

因为记录可以具有构造函数,但不能具有无参数,因此我们对类别有隐式约束。并扭转这个

TSomeClass<T: class>

可能具有隐式构造函数约束

相关内容

最新更新