4

标题差不多就是...

为什么要使用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.
4

2 回答 2

8

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

类约束清楚地暗示了这一点。

不,这不对。构造函数约束要求该类型有一个公共的、无参数的构造函数——然后允许调用该构造函数。

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

于 2012-11-12T12:44:11.147 回答
2

恕我直言,该约束的官方原因是编译器实际上无法自己处理它。

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

也许我们会用 XE9 得到它

更新

如果 TComponent 被接受为没有公共无参数构造函数的类类型,则构造函数约束是无用的,因为 this(来自 Nick 的扩展示例)编译并生成 TComponent 实例。当然它不会调用原来的构造函数 TComponent.Create( AOwner : TComponent ),而是调用了 TObject.Create,但是你有一个 TComponent Instance。

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>

可能有一个隐式的构造函数约束

于 2012-11-12T17:29:20.270 回答