簡體   English   中英

如何在 MATLAB 中為多個屬性編寫通用設置方法

[英]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() 也許覆蓋subsrefsubsasgn - 對私有屬性的影響可能會有所幫助。

目前,我很難實現這些建議,而且覆蓋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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM