我使用 TwinCAT 编写了一个具有许多关节的机器人,每个关节都有一些独特的功能。有些关节有绝对编码器,而有些则需要以特定方式初始化,等等
我使用了一个联合基类(功能块),包含通用方法。并以独特的方法将其继承到各种关节的派生类中。效果很好。
我真的很想循环访问不同类的实例。将它们放入数组是我的第一个想法。我知道 C++ 的向量或 Python 的列表非常适合这项工作。但在 TwinCAT 中似乎不可能。
我尝试了该接口,但是,通过该接口无法使用独特的方法。
我尝试使用一种方法根据输入索引返回实例,但它只能返回一个预定义类(功能块)的实例。
我不知道有直接、简单的“类型转换尝试”运算符。
有 __QUERYINTERFACE (以及相关的 __System.IQueryInterface 接口),它看起来像是类型转换的一种形式。我过去没有使用过它,快速阅读文档,它似乎是针对那些比我更好的人,并且理解为什么这种非标准的、复杂的方式来实现仅适用于接口类型的类型转换是一种好主意。
然后是简单的(但从设计的角度来看很冗长并且不是很好)解决方案:
你不会以此赢得代码优雅竞赛,但它确实有效,而且如果它能在其他地方避免更糟糕的丑陋,那么,它可能是最不丑陋的道路。
在我的工作中,我发现我几乎从不这样做,因为我通常会找到方法将特定于类型的处理保留在功能块内。我将拥有一个对所有没有参数或只有通用参数的实例通用的通用方法。我使用引用注入,以便每个实例对系统的其余部分有足够的了解。