对象上存在测试方法

时间:2012-05-10 15:36:55

标签: oop matlab

我有一个Matlab个对象的单元格数组,类似于:

objs = {Object1(), Object2(), Object3()};

这些对象都是不同的类型。他们中的一些人会有一个方法,我们称之为myMethod()。我想做点什么:

for o = objs
  if hasMethod(o, 'myMethod()')
    o.myMethod();
  end
end

我的困难在于我不知道该怎么办hasMethod - exist在这里似乎没什么用。

我可以使用try - catch,但我宁愿做一些更整洁的事情。有没有办法做到这一点?我应该改变我的设计吗?

5 个答案:

答案 0 :(得分:3)

啊,发现了。不是很令人兴奋 - 您可以使用methods命令获取方法列表。所以要检查对象是否有方法,

if any(strcmp(methods(o), 'myMethod'))
  o.myMethod();
end

答案 1 :(得分:3)

另一种选择是使用元类。

  obmeta = metaclass(ob);
  methodNames = cellfun(@(x){x.Name},obmeta.Methods);

您还可以从obmeta.Methods获取

等其他信息
  • 输入/输出参数的数量。
  • 访问类型
  • 定义方法的类别。

此外,metaclass可以从类的名称构造,没有实例,这在某些情况下可能是有利的。

答案 2 :(得分:2)

非常接近!如果您的功能名称写得有些不同,那么您会偶然发现以下内置内容:

if ismethod(o, 'myMethod')
    o.myMethod();
end

文档:ismethod

答案 3 :(得分:1)

你为什么要那样做?你最好有充分的理由:p

最好让它们从超类继承一般函数。然后你可以为所有这些函数调用该函数,而不是查找它是哪个类/检查函数是否存在然后根据结果调用函数(这不是非常OO)

答案 4 :(得分:0)

一个简单的选择是使用函数EXIST(以及函数CLASS)来检查给定类是否存在该方法:

if exist(['@' class(o) '/myMethod'])
  o.myMethod();
end

另一种选择是使用函数WHICH来执行这样的检查:

if ~isempty(which([class(o) '/myMethod']))
  o.myMethod();
end