9

のサブクラスをdynamicprops作成すると、プロパティをオブジェクトに動的に追加できます。

addprop(obj, 'new_prop')

set / getこれは素晴らしいことですが、これらのプロパティの関数をその場で作成したいと思います。または、これらの動的プロパティで機能する分析関数。

Matlabでの私の経験はこれまでのところ、クラスのインスタンスを作成すると、新しいメソッドを追加することはできません。オブジェクトに大量のデータが含まれている可能性があるため、これは非常に面倒です。新しいメソッドを追加するたびに、データを再ロードする必要があります(実行する必要があるためclear classes)。

では、その場でメソッドを追加する方法はありますか?

4

3 に答える 3

10

動的プロパティを追加するようにメソッドを追加することはできません。ただし、毎回データを再ロードする必要のない、開発中に新しいメソッドを実装する方法が 2 つあります。

(1) 標準メソッドを別の関数として書き、myMethod(obj)開発中のように呼び出します。それらが安定していることを確認したら、それらの署名をクラス定義ファイルに追加します -clear classesもちろん、これには .

(2) set/get メソッドでは、少し複雑です。を使用dynamicpropsして新しいプロパティを追加する場合は、set/get メソッドを指定することもできます (ほとんどの場合、これらのメソッド/関数は、何を参照すればよいかを知るために、プロパティの名前を取得する必要があります)。

addprop(obj,'new_prop');
prop = findprop(obj,'new_prop');
prop.SetMethod = @(obj,val)yourCustomSetMethod(obj,val,'new_prop')

編集

(2.1)結果を保存および取得するための隠しプロパティを設定する方法の例を次に示します(jmlopezの回答に基づく)。明らかに、実際に何を設計しているのかをよりよく理解していれば、これは大幅に改善される可能性があります

classdef myDynamicClass < dynamicprops
    properties (Hidden)
        name %# class name
        store %# structure that stores the values of the dynamic properties
    end
    methods
        function self = myDynamicClass(clsname, varargin)
            % self = myDynamicClass(clsname, propname, type)
            % here type is a handle to a basic datatype.
            self.name_ = clsname;
            for i=1:2:length(varargin)
                key = varargin{i};
                addprop(self, key);
                prop = findprop(self, key);
                prop.SetMethod = @(obj,val)myDynamicClass.setMethod(obj,val,key);
                prop.GetMethod = @(obj)myDynamicClass.getMethod(obj,key);
            end
        end
        function out = classname(self)
            out = self.name_;
        end
    end
    methods (Static, Hidden) %# you may want to put these in a separate fcn instead
        function setMethod(self,val,key)
           %# have a generic test, for example, force nonempty double
           validateattributes(val,{'double'},{'nonempty'}); %# will error if not double or if empty

           %# store
           self.store.(key) = val;

        end
        function val = getMethod(self,key)
           %# check whether the property exists already, return NaN otherwise
           %# could also use this to load from file if the data is not supposed to be loaded on construction 
           if isfield(self.store,key)
              val = self.store.(key);
           else
              val = NaN;
           end
        end
    end
end
于 2012-08-08T10:51:40.683 に答える