В 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.
» во время сборки.
Любые идеи о том, как к этому можно подойти? Прежде чем я сделаю что-то сумасшедшее, я просто хочу проверить, нет ли чего-то очевидного.
Спасибо. Да, мой вопрос действительно смешивал две проблемы: массивы объектов и типы гетерогенных объектов. Бывают ситуации, когда один гетерогенный объект будет очень полезен. Мое решение состоит в том, чтобы создать автогенерируемый класс «объединитель», который внутренне переключается между разными классами. Было бы очень приятно, если бы Coder поддерживал это. – Tony
@Tony Когда вы говорите «один гетерогенный объект», вы хотите, чтобы вы могли назначать производные классы переменной базового класса, а затем иметь динамическую диспетчеризацию на основе типа времени выполнения? Аналогично, вы хотите, чтобы иметь возможность передать производный объект функции, использующей базовый объект? Или я пропустил это? –
Это точно. Например, у меня есть ABC универсального читателя файлов, а затем несколько подклассов, полученных для каждого формата файла. Я хотел бы иметь возможность вызвать методы созданного класса и отправить его в правильную реализацию, на основе которой я создаю экземпляр, но все вызовы останутся неизменными. В настоящее время я делаю это с помощью класса «агрегации», что в точности представляет собой беспорядок операторов switch, которые вы себе представляете, но инкапсулирует экземпляры каждого из производных классов. – Tony