Matlab类:不一致状态和'PostSet'属性监听器
问题描述:
我遇到了与PostSet侦听器结合使用的不一致类状态问题。Matlab类:不一致状态和'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?
- 我可以使用一致性标志作为另一个属性。但是如何延迟侦听器的执行?
- 我可以定义自己的通知,但一切正常与预定义的函数一起工作。
答
两个选择,可以考虑
- 保存所有侦听器处理一些私人财产。然后在需要关闭通知时更改侦听器的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
如何只听'propB'? – chappjc 2014-12-04 20:56:34
@chappjc:在这个例子中看起来可能,但propA和propB都可以单独更改,因此我需要两个监听器。 – 2014-12-05 10:21:42
您需要将第三个标志存储为私有属性,以临时禁用postChange中的比较。你可以在两个赋值之间的setSize中设置它。 – Navan 2014-12-05 16:21:04