如何在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文档中有一些非常好的例子,非常感谢!这就解决了递归问题!这就是我要建议的。