2012-09-18 60 views
1

我想創建一個Matlab類,其中方法屬性在類構造函數中更改。這樣做的目的是隱藏/顯示某些方法,具體取決於類輸入。更改Matlab的方法屬性

例如:

classdef (HandleCompatible) myClass < dynamicprops & handle % & hgsetget 
properties (Hidden) 
    myProp 
end 
methods (Hidden) 
    function obj = myClass(input) 
     %class constructor 
     %add some dynamic properties 
     switch input 
      case 1 
       %unknown code: 
       %make myMethod1 visible 
      case 2 

       %unknown code: 
       %make myMethod2 visible 
      otherwise 
       %unknown code: 
       %make myMethod1 visible 
       %make myMethod2 visible 
     end 
    end 
end 

methods (Hidden) 
    function myMethod1 (obj, input) 
     %function... 
    end 
    function output = myMethod2(obj, input) 
     %function... 
    end 
end 
end 

我嘗試使用以下命令:

mco = metaclass(obj); 
mlist = mco.MethodList; 
mlist(myMethod1Index).Hidden = false; 

,但我得到了以下錯誤:

Setting the 'Hidden' property of the 'meta.method' class is not allowed.


感謝您回覆。

這可能是一個解決方案,如果我需要在類構造函數中選擇性地訪問我的方法。雖然,我需要在我的程序中使用這些方法,並讓他們可見或不可見,在標籤完成:

%Obj1 
myObj1 = myClass (inputs, '-1'); 
myObj1.myMethod1(arg); 
%myObj1.myMethod2 - hidden 


%Obj2 
myObj2 = myClass (inputs, '1'); 
%myObj2.myMethod1 - hidden 
value1 = myObj2.myMethod2(arg); 


%Obj3 
myObj3 = myClass (inputs, '0'); 
myObj3.myMethod1(arg); 
value2 = myObj3.myMethod2(arg); 
%here i want to be able to access both methods 

也許是可以選擇的方法屬性,類構造函數的過程,並更改屬性。但是這必須在不使用元類的情況下完成

回答

1

爲什麼不公開工廠方法並根據輸入構建不同類的實例?您可以使用訪問限定符來鎖定事件,如下所示:

% a.m 
classdef a 
    properties, a_thing, end 
    methods (Access = ?factory) 
     function obj = a() 
     end 
    end 
end 

% b.m 
classdef b 
    properties, b_thing, end 
    methods (Access = ?factory) 
     function obj = b() 
     end 
    end 
end 

% factory.m 
classdef factory 
    methods (Static) 
     function val = build(arg) 
      if isequal(arg, 'a') 
       val = a; 
      else 
       val = b; 
      end 
     end 
    end 
end