Неявное преобразование классов

Механизм преобразования классов

Когда вы создаете или изменяете объектные массивы с помощью конкатенации или назначения под индексом, 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

Похожие темы