0

PostSet Listener と組み合わせたクラスの状態に一貫性がないという問題があります。

classdef myClass < handle 
    properties (SetObservable,GetAccess = public, SetAccess = public )
        propA;
        propB;
    end

    methods
        function myClass = myClass()
            myClass.propA = zeros(2);
            myClass.propB = zeros(2);
            addlistener(myClass,{'propA','propB'},'PostSet',@myClass.propChange);
        end
    end

   methods 

        function setSize(myClass,  size)
            myClass.propA = zeros(size);
            myClass.propB = zeros(size);
        end

        function propChange(obj,eventData, metaProp)
            disp(obj.propA - obj.propB)
        end
    end        
end

主な機能は次のとおりです。

m = myClass();
m.setSize([1,2])

propA と propB のリスナー関数では、両方のプロパティを同じサイズにする必要があります。残念ながら、setSize を使用すると、短時間の矛盾が生じます。

これを解決する方法:

  • PostSet が後で実行されるように propA と propB を同時に設定する方法はありますか?
  • 一貫性フラグを別のプロパティとして使用できます。しかし、リスナーの実行を遅らせる方法は?
  • 独自の通知を定義することはできますが、事前定義された関数ですべてうまく機能しています。
4

1 に答える 1

0

2つのオプションが考えられます

  1. 一部のプライベート プロパティにすべてのリスナー ハンドルを保存します。通知をオフにする必要がある場合は、リスナーの Enabled プロパティを変更します。このソリューションの欠点は、リスナーがクラスの外部から追加されると、リスナー ハンドルが失われることです。
  2. 別のバリアントとして、PostSet イベントの使用を避け、単純なイベントを定義します。この場合、PropA と PropB は、set メソッドと get メソッドを持つパブリック依存プロパティとして定義されます。
classdef myClass < handle

    properties(Access=private)
        mPropA;
        mPropB;
    end

    properties(Dependent)
        PropA;
        PropB;
    end

    methods
        function this = myClass()
            this.mPropA = zeros(2);
            this.mPropB = zeros(2);
            addlistener(this, 'ChangedPropA', @this.propChange);
            addlistener(this, 'ChangedPropB', @this.propChange);
        end
        function setSize(this, sz)
            this.mPropA = zeros(sz);
            this.mPropB = zeros(sz);
            notify(this, 'ChangedPropA');
            notify(this, 'ChangedPropB');
        end
        function val = get.PropA(this)
            val = this.mPropA;
        end
        function set.PropA(this,val)
            this.mPropA = val;
            notify(this, 'ChangedPropA');
        end
        function val = get.PropB(this)
            val = this.mPropB;
        end
        function set.PropB(this,val)
            this.mPropB = val;
            notify(this, 'ChangedPropB');
        end
    end

    methods(Access=private)
        function propChange(this, src, evt)
            disp(src.PropA - src.PropB);
        end
    end

    events
        ChangedPropA;
        ChangedPropB;
    end
end
于 2015-01-31T13:34:07.483 に答える