Когда вы создаете или изменяете массивы объектов с помощью конкатенации или преобразованного в нижний индекс присвоения, MATLAB® пытается преобразовать различающиеся типы, чтобы соответствовать классу массива. MATLAB выполняет это преобразование неявно.
Чтобы выполнить преобразование, MATLAB пытается вызвать метод конвертера, заданный классом, который будет преобразован. Метод конвертера имеет то же имя как целевой класс. Например, если класс задает метод под названием double
, этот метод преобразует объект класса к объекту класса double
.
Если никакой конвертер не существует в классе исходного объекта, то этот вызов решает к вызову конструктора целевого класса.
И конкатенация и преобразованное в нижний индекс присвоение могут заставить MATLAB применять этот механизм преобразования класса. Преобразование может быть успешным или может привести к ошибке, если преобразование не возможно.
В операциях конкатенации доминирующий объект определяет класс полученного массива. MATLAB определяет доминирующий объект можно следующим образом:
Пользовательские классы являются доминирующими по встроенным классам, таким как double
.
Если нет никакого заданного отношения преобладания ни между какими двумя объектами, то крайний левый объект доминирует
Например, в операторе C = [A,B]
, если A
доминирующий объект, MATLAB пытается преобразовать B
к классу A
.
В преобразованном в нижний индекс присвоении левая сторона оператора присваивания задает класс массива. Если вы присваиваете элементы массива, когда правая сторона является различным классом, чем левая сторона, MATLAB пытается преобразовать в класс левой стороны.
Например, присваивая объект ClassB
к элементу массива A
требует преобразования.
A = ClassA; B = ClassB; A(2) = B;
MATLAB сначала ищет метод конвертера, заданный классом исходного объекта B
. Этот метод конвертера должен иметь имя ClassA
в этом случае. Преобразованное в нижний индекс присвоение является эффективно вызовом конвертера, заданного ClassB
:
A(2) = ClassA(B) % Call method of ClassB
Если никакой метод конвертера не существует, этот вызов решает к вызову целевого конструктора класса:
A(2) = ClassA(B) % Call ClassA constructor