1

クラスコンストラクターでメソッド属性が変更される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;

、しかし、次のエラーが発生します。

'meta.method'クラスの'Hidden'プロパティを設定することは許可されていません。


お返事ありがとうございます。

クラスコンストラクターでメソッドに選択的にアクセスする必要がある場合、これは解決策になる可能性があります。ただし、プログラムでこれらのメソッドを使用し、タブ補完時に表示するかどうかを指定する必要があります。

%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

たぶん、クラスコンストラクターの間にメソッドのプロパティを選択し、属性を変更することが可能です。ただし、これはメタクラスを使用せずに実行する必要があります

4

1 に答える 1

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
于 2012-09-18T15:22:50.647 に答える