Matlab类:不一致状态和';PostSet';属性侦听器

Matlab类:不一致状态和';PostSet';属性侦听器,matlab,matlab-class,Matlab,Matlab Class,我遇到了一个问题,即类状态与PostSet侦听器的组合不一致 classdef myClass < handle properties (SetObservable,GetAccess = public, SetAccess = public ) propA; propB; end methods function myClass = myClass() myClass.propA = ze

我遇到了一个问题,即类状态与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
propA和propB上的侦听器函数需要两个属性的大小相同。不幸的是,setSize造成了短暂的不一致

解决方法:

  • 有没有一种方法可以同时设置propA和propB,以便后期执行PostSet
  • 我可以使用一致性标志作为另一个属性。但是如何延迟侦听器的执行呢
  • 我可以定义自己的通知,但是使用预定义的函数,一切都很好

可以考虑两种选择

  • 在某些私有属性中保存所有侦听器句柄。然后在需要关闭通知时更改侦听器的Enabled属性。此解决方案的缺点是,如果从类外部添加侦听器,则侦听器句柄将丢失
  • 另一个变体是避免使用PostSet事件,并定义简单事件。在这种情况下,PropA和PropB将通过set和get方法定义为公共依赖属性
  • classdef myClass
    只监听
    propB
    怎么样?@chappjc:在本例中,这看起来是可能的,但是propA和propB都可以单独更改,因此我需要两个侦听器。您需要存储为私有属性的第三个标志来临时禁用更改后的比较。您可以在两个赋值之间的setSize中设置它。@Navan:这就是我上面所说的“一致性标志”。这应该行得通,但如果可能的话我喜欢避免。
    m = myClass();
    m.setSize([1,2])
    
    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