代码之家  ›  专栏  ›  技术社区  ›  Dev-iL

如何测试异构阵列中的元素类?

  •  0
  • Dev-iL  · 技术社区  · 8 年前

    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 回复  |  直到 8 年前
        1
  •  1
  •   Dev-iL    8 年前

    relational operators 属于 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 .