2013-07-10 6 views
5

オブジェクトXがクラスMyClassであるとします。 MyClassにはメソッドcomputeがあり、U = compute(X,...)を呼び出すと、matlabは自動的にクラスメソッドを呼び出します。しかし、私が実際に欲しいのは、と呼ばれる別の関数を呼び出すことです。パラメータはMyClassオブジェクトで始まります。どのように私はmatlabにクラスメソッドに入るのではなく、この通常の関数を呼び出させるのですか?matlabに過負荷がかかった場合、matlabにクラスメソッドではなく通常の関数を呼び出させる方法はありますか?

+1

両方のバージョンがメンバーメソッドでない理由は何ですか? 'MyClass.compute(x)'と 'compute(x)'の両方を呼び出すこともできます。 – Amro

答えて

6

これを行うには、関数の名前または場所を変更せずにこれを行う方法はありません。 Matlab's function precedence orderをチェックすると、メソッドは常に通常の外部関数の前に実行されます。唯一の実用的なオプションは次のとおりです。

  1. 機能の名前を変更します。
  2. 関数を呼び出すのと同じスクリプトに移動します(上のリストの項目4)
  3. 関数の.mファイルを、スクリプトファイルと同じフォルダ内のprivateというフォルダに移動しますリスト)

UPDATE

小規模なプロジェクトのために非常に実用的ではないが、あなたはまた、packaging your functionsに見てみたいことがあります。良い議論はthis SO postにあります。

+0

問題は、関数名を ' 'compute2'で定義されていないので、matlabはまだクラスメソッドを呼び出そうとしています。 – OneZero

+0

実際に' compute2'という正規関数の名前を変更した場合、正しく呼び出されます。ちょうどR2013aで試しました) – Amro

+0

@OneZero関数名とその関数を含むファイル名の両方を変更する必要があることを覚えておいてください。例えば、 'compute2.m'ファイルの中で' function x = compute2(obj) 'になります。 – Bee

2

あなたcomputeは、MATLABの組み込みであることを起こる場合は、あなたがそうでなければ

builtin('compute', ...) 

を使用することができ、方法はありません - ビーの答えを参照してください。

+0

良い点。私は 'compute'関数がカスタムオブジェクトを最初のパラメータとして受け入れるので、それは組み込み関数ではないと仮定しました。 – Bee

+1

@Bee:true。おそらく、OPは内部を扱っていない。しかし、他の誰かが: –

2

これが必然的に必要な場合は、次のようなことができます。私は強くお勧めしません、とビーの答えに固執する。しかし、時には1つも選択肢がありません。

考え方は、インスタンスを別のクラスにラップして、MATLABの関数ディスパッチでcomputeメソッドが表示されないようにすることです。ただし、compute関数では、ラップされたインスタンスは元のインスタンスと同じに見える必要があります。これは、いくつかのケースで権利を取得するためにトリッキーですが、多くの場合、次は十分です:

classdef Wrapper 

    properties (Access = 'private', Hidden = true) 
     core = []; 
    end 

    methods 

     function this = Wrapper(core) 
      this.core = core; 
     end 

     function varargout = subsref(this, S) 
      if nargout > 0 
       varargout = cell(1, nargout); 
       [varargout{:}] = subsref(this.core, S); 
      else 
       subsref(this.core, S); 
      end 
     end 

    end 

end 

このクラスは、すべてが包まれたインスタンスへの読み取りアクセスを別のクラスとデリゲートのインスタンスをラップします。例えば

、あなたがファイルを持っている場合TestClass.m呼ば:

classdef TestClass 

    properties 
     name = ''; 
    end 

    methods 
     function this = TestClass(name) 
      this.name = name; 
     end 

     function compute(this) 
      fprintf('Instance method! My name is "%s".\n', this.name); 
     end 
    end 

end 

と機能compute.m:内容に応じて

>> t = TestClass('t'); 
>> s = struct('name', 's'); 
>> compute(t) 
Instance method! My name is "t". 
>> compute(s) 
Regular function! My name is "s". 
>> w = Wrapper(t); 
>> compute(w) 
Regular function! My name is "t". 

function compute(x) 
    fprintf('Regular function! My name is "%s".\n', x.name); 
end 

そして、それはこのように動作しますcompute関数はあなたのインスタンスでmiを行いますWrapperにさらに特別な機能を追加する必要があります(例: subsasgn)。また、computeがいくつかのメタクラス - マジックを行うと、これは壊れます。

+0

+1。良い調査作業! – Bee

+0

最後の 'doStuff(w)'は '計算(w)'でなければなりません。 +1の回避策が、私も実際のコードでこれを使用することをお勧めしません:) – Amro

+0

@Amro:ありがとう、修正されました。それは私の試行錯誤のコードから残されたものです。 –

関連する問題