从另一个方法和回调参数调用一个方法

时间:2016-03-17 16:01:11

标签: matlab oop events callback listener

我有一个问题来定义回调参数以及matlab documentation所说的对我没有帮助。

我的第一堂课:

classdef first < handle
   properties
       State = false
   end
   events
      Contact
   end
   methods
      function OnStateChange(obj,newState)
         if newState ~= obj.State
            obj.State = newState;
            notify(obj,'Contact');
         end
      end
      function follower(obj)
          while 1
              data=inputSingleScan(sessions_daq.NI_USB_1);
              if data>3
                  obj.OnStateChange(true)
              else
                  obj.OnStateChange(false)
              end
          end
      end
   end
end

我的第二堂课:

classdef second < handle
   methods
      function obj = answerer(obj_first,obj_third)
         addlistener(obj_first,'Contact',@obj.handleEvnt);
      end

      function handleEvnt(obj,obj_first,~,obj_third,~)
         if obj_first.State
            obj_third.tracker()
         end
      end
   end
end

我的第三堂课:

classdef third < handle
    methods
        function tracker(obj)
            %computations  
        end 
    end
end

这是我得到的错误:

>> o_first=first;
o_third=third;
o_second=second(o_first,o_third);
>> o_first.follower
Warning: Error occurred while executing callback:
Undefined variable obj_third.

Error in second/handleEvnt (line 9)
            obj_third.tracker()

Error in second>@(varargin)obj.handleEvnt(varargin{:}) (line 4)
         addlistener(obj_first,'Contact',@obj.handleEvnt);

Error in first/OnStateChange (line 12)
            notify(obj,'Contact');

Error in first/follower (line 19)
                  obj.OnStateChange(true)

> In first>first.OnStateChange at 12
  In first>first.follower at 19 

你能帮我吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

问题在于您将anonymous function定义为回调addlistener的方式。触发事件时addlistener will provide your function with two inputs。这些输入是:

  1. 触发事件的对象
  2. 一些event.EventData对象,其中包含有关事件本身的信息。
  3. 因此,当您指定回调时,必须适当地处理这两个输入。在您的情况下,您正在调用类的方法,因此,实际上将三个输入传递给您的回调。第一个输入是类的实例,另外两个是addlistener提供的输入。

    所以实际上,你所定义的回调就是这个

    @(src, evnt)obj.handleEvnt(src, evnt)
    

    因此,如果您查看方法second.handleEvnt的函数定义,您将看到已编写它以期待五个输入。

    function handleEvnt(obj,obj_first,~,obj_third,~)
    

    您收到错误的直接原因是因为obj_third并且最后一个输入是而不是通过您提供的回调传递给此函数(因为我们只说它传递三个输入。)

    要解决此问题,您可以重新编写handleEvnt方法,只接受三个输入。

    function handleEvnt(obj, src, evnt)
    

    或者您可以重写您的匿名函数以将其他函数传递给回调。

    @(src,evnt)obj.handleEvnt(src, evnt, other, arguments)
    

    除了使用匿名函数提供的方法之外,您还可以使用任何 MATLAB允许定义callback functions的方式。