在我参与仿制药的过程中,我现在走到了一个死胡同,我希望有人能指出我隐藏的门: - )
鉴于此类型
type
TMyClass = class
private
FMyString: String;
FMyStringList: TStringList;
procedure SetMyString(const Value: String);
procedure SetMyStringList(const Value: TStringList);
public
constructor Create; overload;
constructor Create(InitString : String); overload;
destructor Destroy; override;
property MyString: String read FMyString write SetMyString;
property MyStringList : TStringList read FMyStringList write SetMyStringList;
end;
TMyClassList<T:TMyClass, constructor> = class(TObjectList<T>)
public
constructor Create; overload;
end;
implementation
{ TMyClass }
constructor TMyClass.Create;
begin
inherited;
MyString := '';
MyStringList := TStringList.Create;
MyStringList.Add('This');
MyStringList.Add('is');
MyStringList.Add('a');
MyStringList.Add('test.');
end;
constructor TMyClass.Create(InitString: String);
begin
Create;
MyString := InitString;
end;
我希望能够根据需要使用两个TMyClass构造函数。
constructor TMyClassList<T>.Create;
begin
Add(T.Create);
// Add(T.Create('test')); // <--- THIS FAILS ????
end;
但只有没有参数的那个可用。
我忘了提 - 它不会失败......它不会编译!!
为什么?
此致 Bimmer_R
答案 0 :(得分:4)
我得到了这样的工作:
type
TMyClassClass = class of TMyClass;
...
constructor TMyClassList<T>.Create;
begin
Add(T.Create);
Add(TMyClassClass(T).Create('test'));
end;
...
var
Test : TMyClassList<TMyClass>;
begin
Test := TMyClassList<TMyClass>.Create;
end;
答案 1 :(得分:1)
您无法在泛型类型上指定常规构造函数约束。您所能做的就是指定它们具有单个无参数构造函数,就像您所做的那样。像这样解决这个问题:
TMyClassList<T: TMyClass> = class(TObjectList<T>)
//no need for constructor constraint
...
type
TMyClassClass = class of TMyClass;
...
constructor TMyClassList<T>.Create;
begin
Add(TMyClassClass(T).Create('test'));
end;
您需要在TMyClass
上使用虚拟构造函数来使其按预期工作。
TMyClass = class
constructor Create(InitString : String); virtual;
end;
另一个选择是使用无参数构造函数并使用单独的例程进行初始化。