Как проверить класс элементов в неоднородном массиве?

MATLAB поддерживает группирование объектов, принадлежащих к подклассам реализации общего корневого класса matlab.mixin.Heterogeneous в один массив, который будет иметь класс ближайшего общего предка, например:

hObj = [ uifigure, uibutton, gobjects(1) ];
K>> class(hObj)
ans =    
    'matlab.graphics.Graphics'    

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

Если входные данные являются скалярным или однородным массивом (т. Е. Все объекты имеют один и тот же класс), и мы тестируем сам целевой класс (не включая подклассы), мы получим правильный результат из функции, подобной этой:

function tf = isCorrectClass(hCandidate)
  TARGET = 'matlab.ui.Figure';
  tf = isa(hCandidate, TARGET);
end

Тем не менее, это не будет работать, если hCandidate является гетерогенным массивом, поэтому мы должны сделать:

function tf = isCorrectClass(hCandidate)
  TARGET = 'matlab.ui.Figure';
  tf = arrayfun(@(x)isa(x, TARGET), hCandidate);
end

это работает, потому что выбор отдельных элементов из неоднородного массива заставляет их вернуться к их собственному определенному классу.

Вопрос: Как я могу адаптировать isCorrectClass функция, показанная выше для следующей иерархии, где целевой класс Middle (при условии, что мой входной массив может содержать объекты любого из классов иерархии)?

%                  HierarchyRoot "implements" matlab.mixin.Heterogeneous
%                   /        \
%               Middle       LeafD
%             /    |   \ 
%        LeafA   LeafB  LeafC

1 ответ

Решение

Простой способ добиться этого - использование реляционных операторов metaclass объекты:

function tf = isCorrectClass(hCandidate)
  TARGET = ?Middle; % Assuming such a class exists
  tf = arrayfun(@(x)metaclass(x) <= TARGET, hCandidate);
end

Куда:

mc = ?ClassName возвращает meta.class объект для класса с именем, ClassName , ? Оператор работает только с именем класса, а не с объектом.

и значение metaclass(x) <= TARGET в том, что x может быть подклассом или тем же классом, что и TARGET,

Другие вопросы по тегам