泛型使用构造函数与重载?

时间:2011-09-28 08:33:10

标签: delphi generics

  

可能重复:
  Generics constructor with parameter constraint?

在我参与仿制药的过程中,我现在走到了一个死胡同,我希望有人能指出我隐藏的门: - )

鉴于此类型

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

2 个答案:

答案 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;

另一个选择是使用无参数构造函数并使用单独的例程进行初始化。