如何将对象列表传递给需要实现接口的对象列表的函数?
How to pass a list of objects to a function, which expects a list of objects which implement an interface?
tl;博士:
正在尝试将对象列表传递给函数,该函数需要实现接口的对象列表。所述对象实现该接口。编译器不允许。
正在寻找替代解决方法或我的错误。
设置
我没有使用实际代码,IMO 应该没有关系。对我来说似乎是一个概念性问题。
class TObjectWithInterface
实现了接口 ISomeInterface
并扩展了 class TCustomInterfacedObject
,它只是围绕 [=17= 的引用计数工作] 在 documentation.
中给出
TObjectWithInterface = class(TCustomInterfacedObject, ISomeInterface)
如果有一个过程获取实现该接口的对象列表:
procedure SomeFunction(List: TList<ISomeInterface>)
问题
在 TObjectWithInterface
的函数内部,我尝试使用 TObjectWithInterface
的对象列表调用该函数:
procedure TObjectWithInterface.DoTheStuff(ListOfObjects: TList<TObjectWithInterface>)
begin
// ...
SomeFunction(ListOfObjects); // <-- Compiler error: Incompatible types
// ...
end;
编译器告诉我以下内容:
E2010: Incompatible types: 'System.Generics.Collections.TList' and 'System.Generics.Collections.TList'
愚蠢的解决方法
我真的不喜欢我目前的解决方法,它包括创建一个新列表并将每个 TObjectWithInterface
类型转换为 ISomeInterface
:
procedure TObjectWithInterface.DoTheStuff(ListOfObjects: TList<TObjectWithInterface>)
var
ListOfInterfaceObjects: TList<ISomeInterface>;
begin
// ...
ListOfInterfaceObjects := TList<ISomeInterface>.Create;
for var Object in ListOfObjects do
ListOfInterfaceObjects.Add(Objects as ISomeInterface);
SomeFunction(ListOfInterfaceObjects)
// ...
end;
这对我来说似乎很老套。我可能做了一些愚蠢的事情,或者没有正确理解某些事情,因为这是我第一次尝试在 Delphi 中使用接口。请不要生气。
无论如何,我希望有人能指出我的错误,或者,如果这是语言限制,有其他解决方法。
您将对象列表复制到单独的接口列表中的“解决方法”实际上是正确且适当的解决方案。您不能在需要 TList<Y>
的地方使用 TList<X>
,它们是不同且不相关的类型。仅仅因为您在接口上禁用引用计数不会改变对象与其接口相关的内存布局,所以您仍然必须传递适当的内存指针,这意味着执行必要的从一个到另一个的转换。
tl;博士:
正在尝试将对象列表传递给函数,该函数需要实现接口的对象列表。所述对象实现该接口。编译器不允许。
正在寻找替代解决方法或我的错误。
设置
我没有使用实际代码,IMO 应该没有关系。对我来说似乎是一个概念性问题。
class TObjectWithInterface
实现了接口 ISomeInterface
并扩展了 class TCustomInterfacedObject
,它只是围绕 [=17= 的引用计数工作] 在 documentation.
TObjectWithInterface = class(TCustomInterfacedObject, ISomeInterface)
如果有一个过程获取实现该接口的对象列表:
procedure SomeFunction(List: TList<ISomeInterface>)
问题
在 TObjectWithInterface
的函数内部,我尝试使用 TObjectWithInterface
的对象列表调用该函数:
procedure TObjectWithInterface.DoTheStuff(ListOfObjects: TList<TObjectWithInterface>)
begin
// ...
SomeFunction(ListOfObjects); // <-- Compiler error: Incompatible types
// ...
end;
编译器告诉我以下内容:
E2010: Incompatible types: 'System.Generics.Collections.TList' and 'System.Generics.Collections.TList'
愚蠢的解决方法
我真的不喜欢我目前的解决方法,它包括创建一个新列表并将每个 TObjectWithInterface
类型转换为 ISomeInterface
:
procedure TObjectWithInterface.DoTheStuff(ListOfObjects: TList<TObjectWithInterface>)
var
ListOfInterfaceObjects: TList<ISomeInterface>;
begin
// ...
ListOfInterfaceObjects := TList<ISomeInterface>.Create;
for var Object in ListOfObjects do
ListOfInterfaceObjects.Add(Objects as ISomeInterface);
SomeFunction(ListOfInterfaceObjects)
// ...
end;
这对我来说似乎很老套。我可能做了一些愚蠢的事情,或者没有正确理解某些事情,因为这是我第一次尝试在 Delphi 中使用接口。请不要生气。
无论如何,我希望有人能指出我的错误,或者,如果这是语言限制,有其他解决方法。
您将对象列表复制到单独的接口列表中的“解决方法”实际上是正确且适当的解决方案。您不能在需要 TList<Y>
的地方使用 TList<X>
,它们是不同且不相关的类型。仅仅因为您在接口上禁用引用计数不会改变对象与其接口相关的内存布局,所以您仍然必须传递适当的内存指针,这意味着执行必要的从一个到另一个的转换。