Matlab 类:不一致的状态和“PostSet”属性监听器

Posted

技术标签:

【中文标题】Matlab 类:不一致的状态和“PostSet”属性监听器【英文标题】:Matlab classes: inconsistent state and 'PostSet' property listener 【发布时间】: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:这就是我上面所说的“一致性标志”。这应该可行,但我希望尽可能避免它。 【参考方案1】:

可以考虑两种选择

    将所有侦听器句柄保存在某个私有属性中。然后在需要关闭通知时更改侦听器的 Enabled 属性。此解决方案的缺点是如果从类外部添加侦听器,侦听器句柄将丢失。 作为另一个变体,避免使用 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

【讨论】:

以上是关于Matlab 类:不一致的状态和“PostSet”属性监听器的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 的 mxGetFieldByNumber 和 mxGetFieldNameByNumber 返回不一致的结果

matlab报错矩阵维度不一致如何解决?

Matlab报错:串联的矩阵维度不一致

matlab中维度不一样的两段音频怎么合成一段

Matlab中fread()读出的数据怎么和原来不一致了?

如果 MATLAB Rb2020 中的行和列维度不一致,如何取消嵌套具有嵌套数据和文本内容的元胞数组?