2015-08-27 2 views
1

В MATLAB наследование от matlab.mixin.Heterogeneous для базового класса позволит использовать хороший полиморфизм. Однако, похоже, это не поддерживается в кодере. Во-первых, может ли кто-нибудь подтвердить, что Coder не может использовать matlab.mixin.Heterogeneous, а если нет, есть ли у кого-нибудь хорошее обходное решение?Полиморфизм в кодере MATLAB

Например, у меня есть обычная настройка ABC под названием Shape, которая получена как из ручки, так и из matlab.mixin.Heterogeneous. Затем у меня есть Rectangle и Circle, полученные из Shape. Я хотел бы быть в состоянии иметь массив как:

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 Вероятно, не будет иметь большой полезности в генерации кода без такой поддержки.

+0

Спасибо. Да, мой вопрос действительно смешивал две проблемы: массивы объектов и типы гетерогенных объектов. Бывают ситуации, когда один гетерогенный объект будет очень полезен. Мое решение состоит в том, чтобы создать автогенерируемый класс «объединитель», который внутренне переключается между разными классами. Было бы очень приятно, если бы Coder поддерживал это. – Tony

+0

@Tony Когда вы говорите «один гетерогенный объект», вы хотите, чтобы вы могли назначать производные классы переменной базового класса, а затем иметь динамическую диспетчеризацию на основе типа времени выполнения? Аналогично, вы хотите, чтобы иметь возможность передать производный объект функции, использующей базовый объект? Или я пропустил это? –

+0

Это точно. Например, у меня есть ABC универсального читателя файлов, а затем несколько подклассов, полученных для каждого формата файла. Я хотел бы иметь возможность вызвать методы созданного класса и отправить его в правильную реализацию, на основе которой я создаю экземпляр, но все вызовы останутся неизменными. В настоящее время я делаю это с помощью класса «агрегации», что в точности представляет собой беспорядок операторов switch, которые вы себе представляете, но инкапсулирует экземпляры каждого из производных классов. – Tony