【问题标题】:How do I write a common set method for multiple properties in MATLAB如何在 MATLAB 中为多个属性编写通用设置方法
【发布时间】:2021-06-28 06:24:36
【问题描述】:

我在一个项目中工作,该项目有几个定义属性的类,这些属性基本上使用相同的 set 方法。为了使代码更具可读性,我想实现一个commonSetter 方法。总体目标是将这个commonSetter 方法包含在超类中,以便所有类都可以使用它。

问题已经发布here,但不幸的是,答案不起作用。我将代码更改为以下代码,但出现错误:达到最大递归限制 500。

classdef MyClass

properties
    A
    B
end

methods
    
    function mc = MyClass(a,b) % Constructor
        mc.A = a;
        mc.B = b;
    end
    
    function mc = set.A(mc, value) % setter for A
        mc = mc.commonSetter(value, 'A');
    end
    
    function mc = set.B(mc, value) % setter for B
        mc = mc.commonSetter(value, 'B');
    end
    
    
end

methods(Access = protected)
    
    function mc = commonSetter(mc, value, property)
        % do some stuff
        disp('Made it into the commonSetter!')
        mc.(property) = value;
    end
end 
end

到目前为止,我知道有一个无限循环,其中mc.(property) = value; 调用set.A(或set.B),而后者又调用commonSetter。 在my post @ MathWorks 中提出了以下建议:

为了打破这个循环,我想你应该看看builtin()subsasgn()。也许Overriding subsref and subsasgn - effect on private properties 可以帮上忙。

目前,我很难实现这些建议,而且覆盖subsasgn() 也不太舒服,因为我不确定它将如何影响整个项目。我想知道,如果有人有其他想法或知道如何安全地覆盖subsasgn()

【问题讨论】:

  • commonSetter 需要做什么——基本上只是一些输入验证?
  • 在最小的例子中,它应该设置给定属性的值,例如MyClass('A',2) 或 MyClass('B', 3)。
  • 好的,但在这种情况下,您根本不需要 setter 方法 - 我有一个解决方法,但我想检查它是否符合要求。不管怎样,我会把它写下来作为答案......
  • 谢谢!期待你的回答
  • 请注意,您根本不需要二传手。如果不定义set.A 方法,仍然可以设置A 属性。覆盖subsasgn 也相当简单,因为您可以在检查/调整输入后调用“内置”函数。 MATLAB 文档为此提供了一些非常好的示例。

标签: matlab oop setter


【解决方案1】:

要解决递归错误,您可以让commonSetter 方法输出新值而不是对象。

classdef MyClass

    properties
        A
        B
    end

    methods

        function mc = MyClass(a, b)% Constructor
            mc.A = a;
            mc.B = b;
        end

        function mc = set.A(mc, value)% setter for A
            mc.A = mc.commonSetter(value, 'A'); % update mc.A
        end

        function mc = set.B(mc, value)% setter for B
            mc.B = mc.commonSetter(value, 'B');
        end

    end

    methods (Access = protected)

        function new_value = commonSetter(mc, value, property) % only return the new value
            % do some stuff
            disp('Made it into the commonSetter!')
            if value > 5
                new_value = -10;
            else
                new_value = value;
            end
        end
    end
end

【讨论】:

  • 非常感谢!这解决了递归问题!
  • 这就是我要建议的。
猜你喜欢
  • 2015-12-08
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
相关资源
最近更新 更多