type
TForm72 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TTestForm = class(TForm)
public
constructor CreateTest(AOwner: TComponent); virtual;
end;
TTestForm1 = class(TTestForm)
public
constructor CreateTest(AOwner: TComponent); override;
end;
TTest<T: TTestForm, constructor> = class(TObject)
public
class procedure Test;
end;
var
Form72: TForm72;
implementation
{$R *.dfm}
procedure TForm72.FormCreate(Sender: TObject);
begin
TTest<TTestForm1>.Test;
end;
{ TTest<T> }
class procedure TTest<T>.Test;
var
F: T;
begin
F := T.CreateTest(Application);
Form72.Caption := F.Name;
end;
{ TTestForm }
constructor TTestForm.CreateTest(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
{ TTestForm1 }
constructor TTestForm1.CreateTest(AOwner: TComponent);
begin
inherited;
Caption := 'Bang';
end;
end.
这段代码在XE2中编译通过,但在XE3中却出现了错误"[dcc32 Error] Unit71.pas(55): E2010 Incompatible types: 'T' and 'procedure, untyped pointer or untyped parameter'"。我做错了什么,或者是编译器的问题?
Create
以外的名称并没有任何帮助。我已经修复了另一个答案。我相信TOndrej
是在没有编译器的情况下回答的。因为我已经在那个答案中修复了两个编译错误! - David HeffernanTTestForm(T)
以及为什么那不是bug。特别是因为TClass是VMT指针。好吧,Delphi缺乏协变和逆变,可能无法干净地混合泛型和继承 :-( 顺便问一下,除了RTTI之外,调用那个“默认构造函数”而不知道名称的Delphi方式是什么?New过程不能使用TClass。 - Arioch 'The.CreateTest
是一个构造函数。而且Delphi没有C对象初始化语法,没有构造函数名称。我根本看不出任何Delphi使用情况。 - Arioch 'The