ジェネリック型を使用する私のコードに問題があります。コンパイラは、渡されたリスト(Result
)がTObjectList<TItem>
(TItem
のタイプはT
の場合はTItems
)であることを知りません。なぜTObjectList <S: T>をTObjectListを受け取る関数に渡すことができません<T>?
インタフェース:
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;
そうだね、私はこちら側からそれを見ていませんでした。このコードをリファクタリングする方法はありますか?私がLoadAllのようなインターフェースを持ち、結果リストを返すか、または結果リストをTItems.LoadAllへのパラメータとして渡すことは重要です。しかし、実際の作業は 'TItemsLoader'によって行われています。 TItemsは間接レイヤーです。 TItemsは、どのような種類のアイテムが「知っている」かを知っています。 TItemsLoaderは、項目がTItemまたはその子孫であることのみを知るべきです。 – robertw
私は 'IItemsLoader'インターフェースで他の答えがあると考えています。しかし、ロブはそれを正確に説明し、あなたの直接の質問に答えました。 –