2013-09-26 1 views
4

Я определил абстрактный базовый класс measurementHandler < handle, который определяет интерфейс для всех унаследованных классов. Два подкласса этого класса - a < measurementHandler и b < measurementHandler.Проблема наследования Matlab OOP Matlab (функциональный блок Simulink MATLAB)

Теперь у меня есть функция, которая должна возвращать дескриптор экземпляру любого из этих подклассов (в зависимости от аргументов функции) его вызывающему. Рассмотрим что-то вроде этого:

function returnValue = foobar(index) 
    if index == 0 
     returnValue = a(); 
    else 
     returnValue = b(); 
    end 
end 

Эта функция заключена в функции блока в MATLAB в Simulink (2013a). Когда я пытаюсь моделировать систему, я получаю следующее сообщение об ошибке:

Type name mismatch (a ~= b). 

Может кто-нибудь предложить обходной путь для этого, который все еще позволяет мне воспользоваться ООП & наследования при использовании Simulink?

ответ

4

Этот тип шаблона возможен в функциональном блоке MATLAB только в том случае, если условие «if» можно оценить во время компиляции. Типы не могут переключаться во время выполнения. Можете ли вы сделать значение индекса постоянным на сайте вызова?

+0

Хороший ответ. Я постараюсь выяснить, смогу ли я решить свою проблему таким образом, когда буду завтра на моем столе. Другой возможный подход состоял бы в том, чтобы итерации по массиву объектов измеренияHandler, которые, похоже, не работают с ** функцией MATLAB Function **, не так ли? –

+1

Массив объектов не поддерживается в функциональном блоке MATLAB. – Navan

+0

Получил его на работу. Основная причина использования этого шаблона состояла в том, чтобы перебирать массив 'измеренияHandler', в то время как все они могут иметь пользовательские реализации. Я смог сделать это, развернув цикл с помощью директивы 'coder.unroll'. Таким образом, цикл for обрабатывается во время компиляции, и тип возврата функции определен для каждого отдельного вызова. Спасибо, что поставил меня на правильный путь! –

2

Основная причина использования этого шаблона состояла в том, чтобы перебирать массив measurementHandler, в то время как все они могут иметь пользовательские реализации. Я смог сделать это, развернув цикл с помощью coder.unroll. Пример для вмещающего блока MTALAB Function:

function result = handleAllTheMeasurements(someInputs) 
%#codegen 
    for index = coder.unroll(1:2) 
     measurementHandler = foobar(index); 
     measurementHandler.handleMeasurement(someInputs); 
    end 
result = something; 
end 

Таким образом, цикл получает раскатывает во время компиляции и типа возвращаемой функции корректно определен для каждого отдельного вызова.

+0

Да. Это способ сделать индекс цикла для константы времени компиляции. – Navan