避免警告“非依赖属性的设置方法不应访问......”

Ziz*_*her 3 oop matlab warnings

在名为param1, param2. 他们是独立的,只是受到约束。param2必须等于或大于param1并且如果param1确实存在,则必须始终存在。有问题的代码类似于:

    function set.param1(obj, input)
        disp('setting param1')
        obj.param1 = input;
        if (isempty(obj.param2) || obj.param2 < obj.param1) % Warning on param2
           obj.param2 = obj.param1; % Warning on param2
        end
    end
Run Code Online (Sandbox Code Playgroud)

的类似代码set.param2。代码工作正常,我看不到任何更好的方法。问题 - 它产生警告“设置方法......”,如标题中所述。由于缺乏更好的解决方案,我压制了它们。有没有更好的方法来实现这个功能并且没有警告?显然不是像隐藏功能这样的hacky“解决方案” SetParam2

function SetParam2(obj, input)
   obj.param2 = input;
end
Run Code Online (Sandbox Code Playgroud)

这足以让编辑器感到困惑,它不会抱怨。

DVa*_*rga 5

您可以使用两层属性

  • 暴露的一层 Dependent
  • 一层是私有的并实际存储值

文档中使用了类似的技术:Avoid Property Initialization Order Dependency

classdef TestClass < handle  
    properties (Access = private)
        privateParam1;
        privateParam2;
    end

    properties (Dependent)
         param1;
         param2;
    end

    methods
        function p1 = get.param1(obj)
            p1 = obj.privateParam1;
        end

        function p2 = get.param2(obj)
            p2 = obj.privateParam2;
        end

        function set.param1(obj, input)
            obj.privateParam1 = input;
            if (isempty(obj.privateParam2) || obj.privateParam2 < obj.privateParam1)
                obj.privateParam2 = obj.param1; 
            end
        end

         function set.param2(obj, input)
            if (~isempty(obj.privateParam1) && obj.privateParam1 > input)
                obj.privateParam2 = obj.privateParam1;
            else
                obj.privateParam2 = input;
            end
         end
    end
end
Run Code Online (Sandbox Code Playgroud)

诀窍在这里:privateParam1privateParam2存储两个值。get 和 set 仅针对公开的属性实现,param1并且param2:get返回只是内部属性,并且在这set两个属性中都可以在没有分析器警告的情况下使用,因为它们被标记为Dependent.