Matlab:如何访问事件处理程序内部的对象值?

时间:2019-07-23 12:42:18

标签: matlab class events

我正在尝试在Matlab中引发一个事件。它正在工作,但不像我预期的那样。发生了什么事,就是将源对象作为事件处理程序的参数传递给我,而我无法访问事件处理程序内的对象属性。

这是我的课程:

classdef MyClass < handle
    properties
        Name = 'a';
    end
    events
        Changed
    end
    methods
        function obj = MyClass(current)
            if exist('current','var')
                addlistener(current,'Changed',@ChangedHandle);
            end
        end
        function obj = Change(obj,value)
            notify(obj,'Changed');
        end
        function obj = ChangedHandle(obj,value)
            disp(obj.Name);
        end
    end
end

这些是用于重现正在发生的事情的命令行:

a = MyClass();
b = MyClass(a);
b.Name = 'b';
a.Change(3);

这将返回“ a”,我希望它返回“ b”。

致谢

2 个答案:

答案 0 :(得分:1)

您指定的listener callback接收引发事件的对象的详细信息。侦听器是在创建另一个对象的过程中创建的事实不是侦听器的固有属性,除非您将其有效地嵌入到回调的设计中。

在您的示例中,@ChangedHandle仅用作回调,因为它恰好是current类所属的方法。如果ab属于不同的类,则问题将更加明显:如果ChangedHandle仅是a的方法,则对{{ Name的1}}属性。并且,如果仅使用b的方法,则绑定到b的侦听器将仅具有函数句柄,而无需引用a所属类的实例b

listener callback documentation中所述,您可以使用语法ChangeHandle将特定对象实例current的方法用作事件侦听器。

此方法随后接收格式为@current.ChangedHandle的回调参数,因此您需要在callbackMethod(obj,src,evnt)的定义中添加一个参数。创建监听器时,第一个参数ChangedHandle将是obj引用的实例,因此行current将产生预期的结果而无需修改。

示例中的回调收到的对disp(obj.Name)的引用仍将传递给新的回调–这是侦听器回调的基本行为–但现在可以从第二个参数{{1}访问}。

答案 1 :(得分:1)

在您的addlistener代码中,您没有告诉listener您要在哪个对象上调用该方法,因此Matlab所做的操作会将侦听器应用于current对象,因为那样所有传递给函数的内容,您都可以通过将代码更改为以下内容来进行检查:

addlistener(current,'Changed',@(h,evt)current.ChangedHandle);

如果您希望它运行其他类b (obj)的代码,则可以使用:

addlistener(current,'Changed',@(h,evt)obj.ChangedHandle);