2

Matlab次のようなオブジェクトのセル配列があります。

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

これらのオブジェクトはすべて異なるタイプです。それらのいくつかにはメソッドがあります。それを呼び出しましょうmyMethod()。私は次のようなことをしたい:

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

私の難しさは、どうしたらいいかわからないことです。ここhasMethodexistは役に立たないようです。

を使用することもできますがtry - catch、もっときれいなことをしたいと思います。これを行う方法はありますか?代わりにデザインを変更する必要がありますか?

4

5 に答える 5

3

ああ、見つけた。それほどエキサイティングではありません-methodsコマンドでメソッドのリストを取得できます。したがって、オブジェクトにメソッドがあるかどうかを確認するには、

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

もう1つのオプションは、メタクラスを使用することです。

  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

簡単なオプションの1つは、関数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 に答える