如何将对象列表传递给函数,该函数需要实现接口的对象列表?

     2023-03-31     37

关键词:

【中文标题】如何将对象列表传递给函数,该函数需要实现接口的对象列表?【英文标题】:How to pass a list of objects to a function, which expects a list of objects which implement an interface? 【发布时间】:2021-12-08 17:23:41 【问题描述】:

tl;博士:

试图将对象列表传递给函数,该函数需要实现接口的对象列表。所述对象实现该接口。编译器不允许这样做。

寻找替代解决方法或我的错误。

设置

我没有使用实际代码,这在 IMO 中应该没有关系。对我来说似乎是一个概念问题。

TObjectWithInterface 类实现了ISomeInterface 接口并扩展了TCustomInterfacedObject 类,该类仅围绕IInterface 的引用计数工作,如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:不兼容的类型:“System.Generics.Collections.TList”和“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;

这对我来说似乎很 hacky。我可能做了一些愚蠢的事情,或者没有正确理解某些事情,因为这是我第一次尝试在 Delphi 中使用接口。请不要生气。

无论哪种方式,我希望有人能指出我的错误,或者,如果这是语言限制,有其他解决方法。

【问题讨论】:

【参考方案1】:

将对象列表复制到单独的接口列表中的“解决方法”实际上是正确且正确的解决方案。您不能在需要 TList&lt;Y&gt; 的地方使用 TList&lt;X&gt;,它们是不同且不相关的类型。仅仅因为您在接口上禁用引用计数并不会更改对象相对于其接口的内存布局,因此您仍然必须传递正确的内存指针,这意味着执行从一个到另一个的必要转换。

【讨论】:

杂谈——接口与回调的联系

接口:调用方不需要知道方法如何实现,实现方不需要知道怎么被调用。因此我们定义一个标准,这个标准同时约束调用方与实现方。 回调:回调通常指回调函数。回调是一种通信机制:父组件拥有函数的解释权(用来做什... 查看详情

试图取消引用一个接口,该接口是一个指向后端结构对象的指针,以便我可以按值传递给函数

】试图取消引用一个接口,该接口是一个指向后端结构对象的指针,以便我可以按值传递给函数【英文标题】:TryingtodereferenceaninterfacethatisapointertoastructobjectonthebackendsoIcanpassbyvaluetoafunction【发布时间】:2018-01-3104:27:16【问题描述... 查看详情

如何将变量从 .map() 传递给回调函数

】如何将变量从.map()传递给回调函数【英文标题】:HowtoPassavariablefrom.map()tocallbackfunction【发布时间】:2017-10-0300:42:48【问题描述】:我有一个函数可以将所有相关的员工返回到一个项目中。这是我返回员工列表的代码的一部分... 查看详情

将道具传递给散布在对象内的函数

...一个提取的示例,但它使用的是MaterialUI,我只是对概念/如何构建它有点停留,所以我可以访问props。在下面的示例中,background部分允许我使用箭 查看详情

如何将指针分配给函数中的新对象,而该对象在退出后不会消失[重复]

】如何将指针分配给函数中的新对象,而该对象在退出后不会消失[重复]【英文标题】:HowdoIassignapointertoanewobjectwithinafuncion,withoutthatobjectdissapearingafterexitingit[duplicate]【发布时间】:2019-10-2209:47:18【问题描述】:让我详细说明,... 查看详情

Java - 将指向对象的指针传递给函数

】Java-将指向对象的指针传递给函数【英文标题】:Java-passapointertoanobjecttoafunction【发布时间】:2014-03-3108:23:00【问题描述】:我想要实现的是这样的:MyClassobject=null;doStuff(&object);//`object`cannowbenon-null我目前正在做的是这个,... 查看详情

如何将对象或引用传递给函数?

】如何将对象或引用传递给函数?【英文标题】:Howtopassanobjectorreferencetoafunction?【发布时间】:2020-07-1607:45:27【问题描述】:我想在下面寻求帮助..#include<Encoder.h>//DefaultEncoderclassEncodermainEncoder(2,3);//MyclassclassMyClassprivate:Encode... 查看详情

如何将对象数据类型传递给类或函数?

】如何将对象数据类型传递给类或函数?【英文标题】:Howtopassobjectdatatypetoclassorfunction?【发布时间】:2019-01-2403:40:17【问题描述】:这段代码的结果是我想要的:overridefunonResponse(call:Call<MainResp<ItemMaterial>>,response:Response... 查看详情

将对象数组从 Ajax 函数传递到 Web 服务

】将对象数组从Ajax函数传递到Web服务【英文标题】:PassingarrayofobjectfromAjaxfunctiontowebservice【发布时间】:2020-07-2320:09:37【问题描述】:我有两个相同对象类型的数组,我将它们传递给Web服务API。我在将数组传递给Web服务之前查... 查看详情

如何将对象列表从 C++ 传递到 C#?

】如何将对象列表从C++传递到C#?【英文标题】:HowtopassalistofobjectsfromC++toC#?【发布时间】:2012-01-1817:42:22【问题描述】:我的第一个问题:)我正在使用一个用C++编写的应用程序(游戏的地图编辑器),它的前端UI是用C#编写的。... 查看详情

如何将列表保存到临时目录中的泡菜文件并将该文件传递给函数?

】如何将列表保存到临时目录中的泡菜文件并将该文件传递给函数?【英文标题】:HowdoIsavealisttoapicklefileinatemporarydirectoryandpassthatfileintoafunction?【发布时间】:2014-04-2605:19:56【问题描述】:问题是我从一个来源提取数据,我想将... 查看详情

如何将类列表传递给接口列表?

】如何将类列表传递给接口列表?【英文标题】:HowtopassListofclasstoListofInterface?【发布时间】:2011-11-2915:23:58【问题描述】:我有这样的功能:DoSomething(List<IMyInterface>)IMyInterface是一个接口,而MyClass是一个实现该接口的类类My... 查看详情

如何将智能指针传递给函数?

】如何将智能指针传递给函数?【英文标题】:HowdoIpasssmartpointersintofunctions?【发布时间】:2012-09-1305:50:49【问题描述】:将对象传递给函数时,是否适用于智能指针和其他包含动态内存的对象一样的规则?例如,当我将std::vector... 查看详情

如何使用 stat_cor() 函数将大写字母 P 的 p 值传递给 ggplot 对象?

】如何使用stat_cor()函数将大写字母P的p值传递给ggplot对象?【英文标题】:Howtop-valuewithuppercaseletterPtoaggplotobjectbyusingstat_cor()function?【发布时间】:2021-12-2715:35:09【问题描述】:我创建了一个散点图并尝试在其上添加R和P值。我使... 查看详情

如何将表达式传递给 JavaScript 函数

】如何将表达式传递给JavaScript函数【英文标题】:HowtopassanexpressionintoJavaScriptfunction【发布时间】:2019-12-1317:59:46【问题描述】:我有2个类对象:leta,letb,每个对象都有一个键“值”。我希望能够创建第三个对象letc并计算它的... 查看详情

Django将对象列表传递给模板

】Django将对象列表传递给模板【英文标题】:DjangoPassinglistofobjectstotemplate【发布时间】:2011-08-1713:40:08【问题描述】:我无法在与此处的r\'^compose/$\'相同的模板中传递我的get_profiles。r\'^users/$\'是我用作模型的东西,它可以工作... 查看详情

Python:如何将要处理的对象成员(可能嵌套更深)传递给函数?

】Python:如何将要处理的对象成员(可能嵌套更深)传递给函数?【英文标题】:Python:howtopasstoafunctionwhichobjectmember(possiblynesteddeeperdown)toworkon?【发布时间】:2020-02-2312:30:25【问题描述】:背景我有一个包含列表成员x和y的对象字... 查看详情

如何从该函数内将函数指针传递给该函数

】如何从该函数内将函数指针传递给该函数【英文标题】:Howtopassafunctionpointertoafunctionfromwithinthatfunction【发布时间】:2017-04-1918:36:09【问题描述】:我正在尝试用C++创建一个简单的有限状态机。基本思想是FSM中的每个状态都进... 查看详情