如何循环不同类的实例

问题描述 投票:0回答:1

我使用 TwinCAT 编写了一个具有许多关节的机器人,每个关节都有一些独特的功能。有些关节有绝对编码器,而有些则需要以特定方式初始化,等等

我使用了一个联合基类(功能块),包含通用方法。并以独特的方法将其继承到各种关节的派生类中。效果很好。

我真的很想循环访问不同类的实例。将它们放入数组是我的第一个想法。我知道 C++ 的向量或 Python 的列表非常适合这项工作。但在 TwinCAT 中似乎不可能。

我尝试了该接口,但是,通过该接口无法使用独特的方法。

我尝试使用一种方法根据输入索引返回实例,但它只能返回一个预定义类(功能块)的实例。

plc twincat st
1个回答
0
投票

我不知道有直接、简单的“类型转换尝试”运算符。

有 __QUERYINTERFACE (以及相关的 __System.IQueryInterface 接口),它看起来像是类型转换的一种形式。我过去没有使用过它,快速阅读文档,它似乎是针对那些比我更好的人,并且理解为什么这种非标准的、复杂的方式来实现仅适用于接口类型的类型转换是一种好主意。

然后是简单的(但从设计的角度来看很冗长并且不是很好)解决方案:

  • 定义一个 ENUM,其中每种类型都有一个 ID
  • 定义将在联合数组中使用的 STRUCT,其中每个条目都有一个类型(来自 ENUM)和一个指针。
  • 使用指针赋值来执行强制转换(因为您可以将一种类型的指针的值转换为另一种类型的指针)。

你不会以此赢得代码优雅竞赛,但它确实有效,而且如果它能在其他地方避免更糟糕的丑陋,那么,它可能是最不丑陋的道路。

在我的工作中,我发现我几乎从不这样做,因为我通常会找到方法将特定于类型的处理保留在功能块内。我将拥有一个对所有没有参数或只有通用参数的实例通用的通用方法。我使用引用注入,以便每个实例对系统的其余部分有足够的了解。

© www.soinside.com 2019 - 2024. All rights reserved.