【发布时间】: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()。也许Overridingsubsrefandsubsasgn- effect on private properties 可以帮上忙。
目前,我很难实现这些建议,而且覆盖subsasgn() 也不太舒服,因为我不确定它将如何影响整个项目。我想知道,如果有人有其他想法或知道如何安全地覆盖subsasgn()。
【问题讨论】:
-
commonSetter需要做什么——基本上只是一些输入验证? -
在最小的例子中,它应该设置给定属性的值,例如MyClass('A',2) 或 MyClass('B', 3)。
-
好的,但在这种情况下,您根本不需要 setter 方法 - 我有一个解决方法,但我想检查它是否符合要求。不管怎样,我会把它写下来作为答案......
-
谢谢!期待你的回答
-
请注意,您根本不需要二传手。如果不定义
set.A方法,仍然可以设置A属性。覆盖subsasgn也相当简单,因为您可以在检查/调整输入后调用“内置”函数。 MATLAB 文档为此提供了一些非常好的示例。