Matlab"类处理"?

时间:2016-06-30 21:08:41

标签: matlab

我想迭代Matlab类。这可能吗?

我的应用程序有几个基于不同结构和算法的子类,但每个子类实现相同的(类和实例)方法。所以我很自然地拥有将子类作为参数的测试用例。例如,在Ruby中,这很容易

[ClassA, ClassB].each do |cls|
  if cls.some_class_method? then
    instance = cls.new
    :
  end
end

但是我似乎无法在Matlab中找到一种方法来做到这一点,似乎并没有"类处理"。

有办法吗?

[编辑]

按照@ zeeMonkeez的解决方案,我最终得到了以下内容

function varargout = call_method(class_name, method_name, varargin)
  qualified_name = sprintf('%s.%s', class_name, method_name);
  [varargout{1:nargout}] = feval(qualified_name, varargin{:});
end

我可以在我的测试用例中调用

class_name = 'MVPolyCube';
  :
[x, y, z] = call_method(class_name, 'variables');

解决了我的问题并干掉了我的测试套件。谢谢大家!

1 个答案:

答案 0 :(得分:1)

如果您不介意使用feval,可以执行以下代码。 基本上,我们测试是否存在类名的给定名称的静态方法(使用meta.class)。然后我们使用feval获得所述方法的返回值。基于此,我们实例化一个对象(再次使用feval)。

A.m

classdef A
    methods
        function whoami(this)
            fprintf('I am an A\n');
        end
    end
    methods(Static)
        function out = a
            out = true;
            fprintf('A.a returns %i\n', out);
        end
    end
end

B.m

classdef B
    methods
        function whoami(this)
            fprintf('I am a B\n');
        end
    end
    methods(Static)
        function out = a
            out = false;
            fprintf('B.a returns %i\n', out);
        end
        function out = b
            out = true;
            fprintf('B.b returns %i\n', out);
        end
    end
end

has_static_method.m将用于测试类是否具有静态函数:

function res = has_static_method(class_name, method_name) 
    mc = meta.class.fromName(class_name);
    ml = mc.MethodList;
    ml = ml([mc.MethodList.Static]);
    res = any(strcmp(method_name, {ml.Name}));
end

test.m

classes = {'A', 'B'};
for i_c = 1:numel(classes)
    klass_name = classes{i_c};
    static_function_name = 'a';
    if has_static_method(klass_name, static_function_name) && feval(sprintf('%s.%s', klass_name, static_function_name))
        an_object = feval(klass_name);
        an_object.whoami
    end
    static_function_name = 'b';
    if has_static_method(klass_name, static_function_name) && feval(sprintf('%s.%s', klass_name, static_function_name))
        an_object = feval(klass_name);
        an_object.whoami
    end
end