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 返回不一致的结果