gpt4 book ai didi

delphi - 为什么我不能传递 TObjectList to a function expecting a TObjectList?

转载 作者:行者123 更新时间:2023-12-03 14:48:14 24 4
gpt4 key购买 nike

我的代码有问题,它使用泛型类型。为什么编译器不知道传递的列表( Result )是 TObjectList<TItem> ( TItemTTItems 的类型)?

界面:

type
TItem = class
end;

type
IItemsLoader = interface
procedure LoadAll(AList : TObjectList<TItem>);
end;

type
TItemsLoader = class(TInterfacedObject, IItemsLoader)
public
procedure LoadAll(AList : TObjectList<TItem>);
end;

type
IItems<T : TItem> = interface
function LoadAll : TObjectList<T>;
end;

type
TItems<T : TItem> = class(TInterfacedObject, IItems<T>)
private
FItemsLoader : TItemsLoader;
public
constructor Create;
destructor Destroy; override;
function LoadAll : TObjectList<T>;
end;

实现:

procedure TItemsLoader.LoadAll(AList: TObjectList<TItem>);
begin
/// some stuff with AList
end;

{ TItems<T> }

constructor TItems<T>.Create;
begin
FItemsLoader := TItemsLoader.Create;
end;

destructor TItems<T>.Destroy;
begin
FItemsLoader.Free;
inherited;
end;

function TItems<T>.LoadAll: TObjectList<T>;
begin
Result := TObjectList<T>.Create();

/// Error here
/// FItemsLoader.LoadAll(Result);
end;

最佳答案

您还必须使用加载程序的通用版本:

type
TItem = class
end;

type
IItemsLoader<T: TItem> = interface
procedure LoadAll(AList : TObjectList<T>);
end;

type
TItemsLoader<T: TItem> = class(TInterfacedObject, IItemsLoader<T>)
public
procedure LoadAll(AList : TObjectList<T>);
end;

type
IItems<T : TItem> = interface
function LoadAll : TObjectList<T>;
end;

type
TItems<T : TItem> = class(TInterfacedObject, IItems<T>)
private
FItemsLoader : TItemsLoader<T>;
public
constructor Create;
destructor Destroy; override;
function LoadAll : TObjectList<T>;
end;


implementation

{$R *.dfm}

procedure TItemsLoader<T>.LoadAll(AList: TObjectList<T>);
begin
/// some stuff with AList
end;

{ TItems<T> }

constructor TItems<T>.Create;
begin
FItemsLoader := TItemsLoader<T>.Create;
end;

destructor TItems<T>.Destroy;
begin
FItemsLoader.Free;
inherited;
end;

function TItems<T>.LoadAll: TObjectList<T>;
begin
Result := TObjectList<T>.Create();

/// Error here
FItemsLoader.LoadAll(Result);
end;

关于delphi - 为什么我不能传递 TObjectList<S : T> to a function expecting a TObjectList<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10354710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com