2011-07-08 28 views
12

我正在使用MATLAB中的超聲波模擬命令行應用程序。我們代碼中的幾乎每個對象都是句柄的一個子類(作爲引用傳遞)。我遇到的問題是所有從句柄類繼承的方法出現在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不錯的發現... – Amro

+0

鏈接似乎中斷。 (我認爲標準政策是 - 或已經轉向 - 從外部鏈接彙總信息。) – sage

+0

@sage:令人失望的是鏈接被破壞。幸運的是,第二段提供了總結。 – 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 

這樣做意味着您不需要將重載放在Test類中,從而保持整潔。

+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); 
相關問題