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