0

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
4

1 回答 1

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

于 2017-11-26T12:26:06.663 回答