【问题标题】:Automatic change values, in instance of class, by event在类的实例中,按事件自动更改值
【发布时间】:2019-02-07 08:00:54
【问题描述】:

我想创建一个类(为简单起见),只要我更改类实例中的输入参数,它就会添加两个数字。为简单起见,我创建了这个类:

classdef test < handle
    properties (Constant)
        privatNummer = 10;
    end

    properties
        brugerNummer;
        sum;
    end

    methods
        function obj = test()
            obj.sum = method1(obj);
        end

        function obj = method1(obj)
            obj.sum = obj.brugerNummer + obj.privatNummer;
        end
    end
end

当我给它一个新值时,如何让它自动更新 obj.sum?目前我每次想要更新 obj.sum 时都必须运行 obj.method1。

我已经尝试过这样的事情(但我就是无法让它工作):

classdef test < handle
    properties (Constant)
        privatNummer = 10;
    end

    properties
        brugerNummer;
        sum;
    end

    methods
        function obj = test()
            notify(obj,'StateChange')
            obj.sum = method1(obj);
            addlistener(obj.brugerNummer,'Ændret nummer',@RespondToToggle.method1);
        end

        function src = method1(src)
            src.sum = src.brugerNummer + src.privatNummer; 
        end
    end
    events
        StateChange
    end
end

【问题讨论】:

  • 你打算怎么给一个新号码?这对我来说不是很清楚。当你给一个新号码时,你必须调用一个函数。此功能也可以更新其他号码。您可能想查看属性设置器,它们是在您执行obj.sum=2 时调用的函数。您可能还想调查依赖属性,这是您尝试实现的。
  • 嗨@CrisLuengo。我将创建一个脚本,在其中创建类的一个实例:a = test;,然后我将更改a.brugerNummer = 10。我希望每次自动更改brugerNummer 时都会计算a.sum。这是一个相当简单的例子。我正在尝试编写一个类,该类根据一个参数(温度、密度、绝热块模块等)计算任何给定介质中的速度声。 yeats 我一直在使用 Matlab,但是 oop 对我来说是新的。无论如何,感谢您的帮助!我肯定会研究属性设置器和依赖属性。
  • *音速... (:
  • @bgaard 正如@CrisLuengo 提到的,您可以为sum 属性实现Dependent Property。另一种选择可能是使用PostSet 事件侦听器。简而言之,将brugerNumer 的属性访问设置为SetObservable=true,然后添加一个事件侦听器addlistener(obj, "brugerNumer", "PostSet", @callbackFcn),然后定义回调函数(function callbackFcs(obj, source,event)...)来执行您所需的计算和修改其他属性。
  • 您可以按照@Khlick 对事件侦听器的建议进行操作,或者您可以简单地定义一个方法obj = set.brugerNummer(obj,value),在分配值时调用该方法。

标签: matlab events listener class-design


【解决方案1】:

我针对这些问题开发了两种解决方案。第一个依赖Dependentproperties,setter和getter;第二个依赖于监听器和回调函数。

第一个解决方案:

classdef test
    properties (Constant)
        privatNummer = 10;
    end

    properties
        brugerNummer;
    end
    properties (Dependent)
        sum;
    end

    methods   
        function obj = test()
            % Constructor
        end     

        function value = get.sum(obj)
            value = obj.brugerNummer + obj.privatNummer;
        end
    end
end

第二个解决方案(这真的很麻烦):

classdef test < handle
    properties (Constant)
        privatNummer = 10;
    end

    properties (SetObservable)
        brugerNumber;
    end
    properties
        sum;
    end

    methods
        function obj = test()
            % constructor
            addlistener(obj, 'brugerNumber', 'PostSet',@test.callbackFun);
        end

    end

    methods (Static)
        function callbackFun(~,evnt)
            obj = evnt.AffectedObject;
            obj.sum = obj.brugerNumber + obj.privatNummer;
        end     
    end
end

【讨论】:

  • 很好的解决方案@bgaard。我建议进行编辑。 PostSet 回调不需要静态方法。您可以简单地调用另一个方法(公共或其他方法)并处理预期的sourceevent 输入(doSum(obj,source,event)...)。尽管如此,在我看来,依赖方法是最好的选择。
猜你喜欢
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 2022-01-20
  • 2017-11-15
  • 2014-01-17
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多