2

我有一个Matlab对象单元格数组,例如:

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

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

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

我的困难是我不知道该怎么做hasMethod-exist在这里似乎没有帮助。

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

4

5 回答 5

3

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

if any(strcmp(methods(o), 'myMethod'))
  o.myMethod();
end
于 2012-05-10T15:59:43.590 回答
3

另一种选择是使用元类。

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

您还可以从obmeta.Methods类似处获取更多信息

  • 输入/输出参数的数量。
  • 访问类型
  • 该方法在哪个类中定义。

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

于 2012-05-10T17:40:09.190 回答
2

很接近!如果你写的函数名有点不同,你会偶然发现以下内置函数:

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

文档:ismethod

于 2017-05-11T14:57:17.883 回答
1

你为什么想这么做?你最好有一个很好的理由:p

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

于 2012-05-10T15:43:07.407 回答
0

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

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

另一种选择是使用函数WHICH执行如下检查:

if ~isempty(which([class(o) '/myMethod']))
  o.myMethod();
end
于 2012-05-10T17:47:50.687 回答