Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中编写多个属性的通用集合方法_Matlab_Oop_Setter - Fatal编程技术网

如何在MATLAB中编写多个属性的通用集合方法

如何在MATLAB中编写多个属性的通用集合方法,matlab,oop,setter,Matlab,Oop,Setter,我在一个有几个类的项目中工作,这些类定义了本质上使用相同集合方法的属性。为了使代码更具可读性,我想实现一个commonSetter方法。总体目标是在超类中包含这个commonSetter方法,以便所有类都可以使用它 问题已经发布,但不幸的是,答案不起作用。我将代码更改为以下内容,但得到了错误:达到了最大递归限制500 classdef MyClass properties A B end methods function mc = MyClass(a,b)

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

问题已经发布,但不幸的是,答案不起作用。我将代码更改为以下内容,但得到了错误:达到了最大递归限制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
。 有人建议:

要打破这个循环,我想你应该看看
builtin()
subsasgn()
。也许能帮点忙


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

要解决递归错误,可以让
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

commonSetter
需要做什么-基本上只是一些输入验证吗?在最简单的示例中,它支持为给定属性设置值,例如MyClass('A',2)或MyClass('B',3).好的,但在这种情况下,您根本不需要setter方法-我有一个解决方案,但我想检查它是否符合要求。无论如何,我会把它写下来作为答案的……谢谢!我期待着你的回答注意,你根本不需要二传手。如果未定义
set.A
方法,仍可以设置
A
属性。重写
subsasgn
也相当简单,因为您可以在检查/调整输入后调用“内置”函数。MATLAB文档中有一些非常好的例子,非常感谢!这就解决了递归问题!这就是我要建议的。