2011-07-08 10 views
12

私はMATLABで超音波シミュレーションのコマンドラインアプリケーションを開発しています。コードのほとんどすべてのオブジェクトは、(参照として渡す)handleのサブクラスです。私が抱えている問題は、ハンドルクラスから継承されたすべてのメソッドがMATLABの "メソッド"セクションに表示されることです(下記の例を参照)。matlabのハンドルクラスから継承したメソッドを非表示にすることはできますか?

私が望むのは、継承されたメソッドをハンドルクラスから隠して、ユーザーが使用できる関数のみが「メソッド」に表示されるようにすることです。ユーザーが使用する方法を知りたい場合には、このようにしてユーザーにとっては面倒ではありません。

例テストクラス:コマンドラインで

classdef Test < handle 
    methods 
     function myFunction(obj) 
     end 
    end 
end 

T = Test() 

T = 

    Test handle with no properties. 
    Methods, Events, Superclasses 

"メソッド" をクリックした後:私が欲しいもの

Methods for class Test: 

Test   delete  findobj  ge   isvalid  lt   ne   
addlistener eq   findprop  gt   le   myFunction notify 

Methods for class Test: 

Test   myFunction 

これはMATLABでも可能ですか?

答えて

9

サンプルコードを含む解決策hereがあります。

要するに、Matlabの組み込み関数methodsをオーバーロードして、クラスで呼び出されたときに、出力からhandleのメソッドを削除するようにします。他のすべてのコードでも機能することを確認してください。ただし、ユーザーの他のコードを壊さないようにしてください。 @foldernameバリアントを使用してクラスを保存しない場合は、たとえばprivateディレクトリに配置できます。

+0

+1 nice find ... – Amro

+0

リンクが壊れているようです。 (私は標準的な方針が外部リンクからの情報を要約することになっていると思っています。) – sage

+0

@sage:リンクが壊れていると酷いです。幸いにも、第2段落は要約を提供します。 – Jonas

2

完全な解決策ではありませんが、methods(T, '-full')を実行すると、どのメソッドがハンドルから継承されているかがわかりますので、何を無視するか分かります。

+0

回答ありがとうございます。これは私が探していたものではありませんが、知っておくとよいことです。多分私はそれをOPでよりよく説明していたはずです。私がこれを行う主な理由は、ユーザが「役に立たない」ものをすべて手に入れずにクラスの自動補完を使用できることです。 – bakstad

14

隠されたメソッドブロックのすべてのサブクラスメソッドをオーバーロードすると、探しているものを正確に処理できると思います。

Matlabのどのバージョンが動作しているのかよく分かりませんが、R2012bの私にとっては間違いなく動作します。

例外はisvalidであるため、ハンドルサブクラスでは無効にすることはできません。

classdef handle_light < handle 
    methods(Hidden) 
     function lh = addlistener(varargin) 
     lh = [email protected](varargin{:}); 
     end 
     function notify(varargin) 
     [email protected](varargin{:}); 
     end 
     function delete(varargin) 
     [email protected](varargin{:}); 
     end 
     function Hmatch = findobj(varargin) 
     Hmatch = [email protected](varargin{:}); 
     end 
     function p = findprop(varargin) 
     p = [email protected](varargin{:}); 
     end 
     function TF = eq(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = ne(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = lt(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = le(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = gt(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = ge(varargin) 
     TF = [email protected](varargin{:}); 
     end 
     function TF = isvalid(varargin) 
     TF = [email protected](varargin{:}); 
     end 
    end 
end 

あなたがhandle_light.mするために、上記のクラスを保存し、コマンドウィンドウにmethods handle_lightを入力する場合は、次の結果を取得します:テストクラスは、その後になっ

Methods for class handle_light: 

handle_light isvalid 

を:

classdef Test < handle_light 
    methods 
     function myFunction(obj) 
     end 
    end 
end 

このようにすると、テストクラスでオーバーロードを置く必要がなくなり、テストクラスをより細かく保つことができます。

+0

完璧!私は私の[matlab-utilities](https://github.com/ransage/matlab-utilities/blob/master/ThirdPartyTools/handle_light.m)にこれを(些細な変更を加えて)組み込みました。これは、コピー/それが属性を持っているので、ペーストしてください。 – sage

+0

@sageそれは素晴らしいです!私は他の誰かがそれが有用であると分かってうれしいです。 – sclarke81

+1

この回答は私に多くの感謝を助けました。ハンドルメソッドのリストに 'isvalid'がありましたが、あなたの答えを更新したいかもしれません。 –

0

継承されたクラスから関数を取得し、setdiffを使用してメインクラスの関数を取り消すだけです。

mH = methods('handle'); 
m = methods('MyClass'); 

m = setdiff(m,mH); 
関連する問題