0

与 PostSet 侦听器结合使用时,我遇到了不一致的类状态问题。

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 会造成短暂的不一致。

解决方法:

  • 有没有办法同时设置 propA 和 propB 以便稍后执行 PostSet?
  • 我可以使用一致性标志作为另一个属性。但是如何延迟监听器的执行呢?
  • 我可以定义自己的通知,但一切都与预定义的功能很好地配合。
4

1 回答 1

0

可以考虑两种选择

  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 回答