MATLAB Coder 中的多态性

Posted

技术标签:

【中文标题】MATLAB Coder 中的多态性【英文标题】:Polymorphism in MATLAB Coder 【发布时间】:2015-08-27 19:58:41 【问题描述】:

在 MATLAB 中,从 matlab.mixin.Heterogeneous 继承基类将允许很好的多态性。但是,Coder 似乎不支持此功能。首先,谁能确认 Coder 不能使用 matlab.mixin.Heterogeneous,如果不能,有没有人有好的解决方法?

例如,我有一个称为 Shape 的 ABC 的常规设置,它源自句柄和 matlab.mixin.Heterogeneous。然后我有从形状派生的矩形和圆形。我希望能够有一个像这样的数组:

classdef Shape < handle & matlab.mixin.Heterogeneous
classdef Circle < Shape
classdef Rectangle < Shape
harray = [Rectangle(height, width), Circle(radius)];

在Matlab中,harray变成了一个类型“1x2 heterogeneous Shape (Rectangle, Circle) array

在 Coder 中,我在构建过程中收到错误“Base class 'matlab.mixin.Heterogeneous' cannot be loaded.”。

有什么想法可以解决这个问题吗?在我做一些疯狂的事情之前,我只是想检查一下我是否遗漏了一些明显的东西。

【问题讨论】:

【参考方案1】:

您是正确的,matlab.mixin.Heterogeneous 不支持代码生成。我向 MATLAB Coder 团队报告了您使用它的愿望以及不明确的错误消息。

对象数组是 not supported 用于代码生成(请参阅该链接中的项目符号 3)。如果你尝试:

[Circle(1), Circle(1)]

你会得到一个错误说明这个事实:

???代码生成不支持对象数组。

如果没有这种支持,matlab.mixin.Heterogeneous 在代码生成中可能不会有太多实用性。

【讨论】:

谢谢。是的,我的问题实际上混合了两个问题:对象数组和异构对象类型。在某些情况下,单个异构对象会非常有用。我对此的解决方案是制作一个自动生成的“组合器”类,在不同的类之间进行内部切换。让 Coder 支持这一点将是一个非常好的功能。 @Tony 当您说“单个异构对象”时,您的意思是您希望能够将派生类分配给基类变量,然后根据运行时类型进行动态分派吗?同样,您是否希望能够将派生对象传递给采用基础对象的函数?还是我没有抓住重点? 完全正确。例如,我有一个通用文件阅读器的 ABC,然后为每种文件格式派生了多个子类。我希望能够调用实例化类的方法,并根据我实例化的类将其分派到正确的实现,但所有调用都将保持不变。我目前通过一个“聚合”类来做到这一点,这正是你想象的混乱的 switch 语句,但封装了每个派生类的实例。 谢谢@Tony,我也记下了。

以上是关于MATLAB Coder 中的多态性的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB R2014b 中的 MATLAB Coder 和 parfor

具有外部 C++ 函数的 Matlab:coder.ceval 将结构传递给函数

java中的多态性

OCaml 中的弱多态性

Storyboard ViewControllers 中的多态性

Java中的多态性