【问题标题】:Matlab classes: inconsistent state and 'PostSet' property listenerMatlab 类:不一致的状态和“PostSet”属性监听器
【发布时间】:2014-12-04 20:33:36
【问题描述】:

我遇到了与 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?
  • 我可以使用一致性标志作为另一个属性。但是如何延迟监听器的执行呢?
  • 我可以定义自己的通知,但使用预定义的函数一切都很好。

【问题讨论】:

  • 只听propB 怎么样?
  • @chappjc:在这个例子中看起来可行,但是 propA 和 propB 都可以单独更改,因此我需要两个监听器。
  • 您需要将第三个标志存储为私有属性,以暂时禁用 postChange 中的比较。您可以在两个分配之间的 setSize 中设置它。
  • @Navan:这就是我上面所说的“一致性标志”。这应该可行,但我希望尽可能避免它。

标签: matlab matlab-class


【解决方案1】:

可以考虑两种选择

  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

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多