[英]How do I write a common set method for multiple properties in MATLAB
我在一個項目中工作,該項目有幾個類,這些類定義了使用基本相同的 set 方法的屬性。 為了使代碼更具可讀性,我想實現一個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
。 在我的@ MathWorks 帖子中,建議如下:
為了打破這個循環,我想你應該看看
builtin()
和subsasgn()
。 也許覆蓋subsref
和subsasgn
- 對私有屬性的影響可能會有所幫助。
目前,我很難實現這些建議,而且覆蓋subsasgn()
也不太舒服,因為我不確定它將如何影響整個項目。 我想知道,如果有人有其他想法或知道如何安全地覆蓋subsasgn()
。
要解決遞歸錯誤,您可以讓commonSetter
方法 output 代替 object 的新值。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.