标题就是它......
为什么要使用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.
答案 0 :(得分:8)
为什么要使用构造函数约束?
类约束明确暗示了这一点。
不,不是。构造函数约束要求类型具有公共的无参数构造函数 - 然后允许调用该构造函数。
并非所有类都具有公共无参数构造函数。
答案 1 :(得分:2)
恕我直言,这种约束的官方原因是编译器实际上无法自己处理它。
它只是编译器的一个标志,也可以由他自己设置,因为编译器确实认识到我们需要构造函数约束这一事实。所以它可以由编译器自动处理,因为Generic类将在使用该类之前进行编译。
也许我们会用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>
可能有隐式构造函数约束