delphi 如何创建Spring4D IList的后代< T>?

jc3wubiy  于 2023-05-28  发布在  Spring
关注(0)|答案(1)|浏览(170)

我是Spring 4D的新用户。我一直在通过转换一些现有的代码来试验它,我遇到了这个:

{Using System.Generics.Collections}
  TDenonInputList = class(TObjectList<TDenonInput>)
  private
    function GetInputByName(Name: string): TDenonInput;
    function GetInputByRename(Name: string): TDenonInput;
  public
    constructor Create;
    destructor Destroy; override;
    procedure LockedAdd(ADenonInput: TDenonInput);
    procedure LockedClear;
    property Names[Name: string]: TDenonInput read GetInputByName;
    property Renames[Name: string]: TDenonInput read GetInputByRename;
  end;

所以,我通过这样做来转换它:

{Using Spring4D.Collections.Lists}
  IDenonInputList = interface(IList<TDenonInput>)
    ['{2201FB6B-1B9C-4FEE-9614-EFF2A7D35957}']
    function GetInputByName(Name: string): TDenonInput;
    function GetInputByRename(Name: string): TDenonInput;
    procedure LockedAdd(ADenonInput: TDenonInput);
    procedure LockedClear;
    property Names[Name: string]: TDenonInput read GetInputByName;
    property Renames[Name: string]: TDenonInput read GetInputByRename;
  end;

  TDenonInputList = class(TList<TDenonInput>, IDenonInputList)
  private
    function GetInputByName(Name: string): TDenonInput;
    function GetInputByRename(Name: string): TDenonInput;
    procedure LockedAdd(ADenonInput: TDenonInput);
    procedure LockedClear;
  public
    constructor Create;
    destructor Destroy; override;
  end;

然后我通过这样做创建新的列表类型:

var
  InputList: IDenonInputList;
begin
  InputList := TDenonInputList.Create;
   {...}
end;

然而,我读到应该使用TCollections中的工厂函数来创建Spring 4D列表,例如TCollections.CreateList<T>。虽然我所做的工作似乎很好,但我的问题是:有没有更正确的方法来创建IDenonInputList的示例,或者有没有更合适的方法来创建IList的后代并向IList<T>添加额外的函数/属性?

3mpgtkmj

3mpgtkmj1#

TCollections的工厂函数用于创建内置集合,因为它们以各种方式执行代码折叠,以避免二进制代码膨胀。如果你继承了这些类,你可以自由地创建它们。但是请记住,如果过度使用它们,二进制文件的大小可能会比使用内置工厂函数时更大。如果你想应用与Spring中相同的代码折叠技术,你需要编写与TCollections中类似的工厂函数。
另外,请记住,我将Spring.Collections.* 单元中的类视为实现细节,并且可能在需要时更改它们,而不会特别注意Spring外部继承它们的任何代码仍然有效。

相关问题