Как проверить класс элементов в неоднородном массиве?
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
,