2014-12-04 79 views
0

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

如何只听'propB'? – chappjc 2014-12-04 20:56:34

+0

@chappjc:在这个例子中看起来可能,但propA和propB都可以单独更改,因此我需要两个监听器。 – 2014-12-05 10:21:42

+0

您需要将第三个标志存储为私有属性,以临时禁用postChange中的比较。你可以在两个赋值之间的setSize中设置它。 – Navan 2014-12-05 16:21:04

回答

0

两个选择,可以考虑

  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