Matlab 动态更改属性属性

Matlab 动态更改属性属性,matlab,properties,attributes,private-members,Matlab,Properties,Attributes,Private Members,类A中有依赖属性,基于构造函数中的参数,我想隐藏一些属性,以便用户无法设置/获取这些属性 classdef A properties (Dependent = true) prop1 prop2 end methods function value = get.prop1(obj) ... end function value = get.prop2(obj)

类A中有依赖属性,基于构造函数中的参数,我想隐藏一些属性,以便用户无法设置/获取这些属性

classdef A
    properties (Dependent = true)
        prop1
        prop2
    end

    methods
        function value = get.prop1(obj)
        ...
        end
        function value = get.prop2(obj)
        ...
        end
    end

    methods(Access = public)
         function obj = A(arg1)
             if arg1 == 1
                  % make prop1 Hidden for the constructed object
             end
         end
    end
end
下面是示例用法:

a1 = A(2);
a1.prop1;   % ok
a2 = A(1);
a2.prop1;   % problem, user will not know about existence prop1

编辑:我将创建两个不同的类,一个具有隐藏属性,另一个具有可见属性

在这种情况下,您可以在隐藏类中设置相应的属性属性。这应该做到:

properties (Dependent = true, Hidden = True, GetAccess=private, SetAccess=private)

访问
级别是固定的,就像我所知道的任何OOP语言一样。它是类如何与其他代码交互的基础

唯一的解决方法是使用
matlab.mixin.SetGet
类型类的
Dependent
属性,并具有基于构造参数的条件行为。下面是一个
POC
类来演示:

类别:

classdef POC < matlab.mixin.SetGet
    properties ( Dependent = true )
        prop
    end
    properties ( Access = private )
        arg   % Construction argument to dictate obj.prop behaviour
        prop_ % Private stored value of prop
    end
    methods
        function obj = POC( arg )
            % constructor
            obj.prop = 'some value'; % Could skip setting this if argCheck fails
            obj.arg = arg;
        end

        % Setter and getter for "prop" property do obj.argCheck() first.
        % This throws an error if the user isn't permitted to set/get obj.prop
        function p = get.prop( obj )
            obj.argCheck();
            p = obj.prop_;
        end
        function set.prop( obj, p )                
            obj.argCheck();
            obj.prop_ = p;
        end
    end
    methods ( Access = private )
        function argCheck( obj )
            % This function errors if the property isn't accessible
            if obj.arg == 1
                error( 'Property "prop" not accessible when POC.arg == 1' );
            end
        end
    end
end

如果arg1不是1,则所有属性都将对用户可见。键入对象名称后,用户将看到所有属性,并完成选项卡。在您的解决方案中,无论构造函数中的arg1如何,它们都将被隐藏。啊,好吧,我现在明白了!为什么不针对每种情况使用两个不同的类呢?你是对的,但我不想因为不同的原因创建类。我有几十个属性(不仅仅是两个),我只举了一个简单的例子来简要说明我的问题。即使你有很多属性,仍然只有ctrl+c和ctrl+v并更改一行。有没有其他你到目前为止没有提到的复杂问题?@NewEyes有很多原因说明为什么多个类似的类不如一个灵活的类。如果要修改函数的工作方式,该怎么办?现在您必须在许多类文件中编辑它。我认为有更好的解决方案,或者OP应该考虑为什么他们想要实现这个功能并做一些不同的事情。你从哪里得到这个想法的?我从未见过OOP语言能让你动态地改变属性属性(除非你考虑反射,我认为这不是Matlab类的东西)。正如NewEyes提到的,我只使用了两个不同的类。@Dev-iL在Smalltalk(一种根OO语言)中,一切都是动态定义的,类和methods@Dev-我知道OOP。当然,我可以通过课堂解决。但我正试图找到一个非面向对象的解决方案。此外,MATLAB与其他面向对象语言不同。根据一些观点,MATLAB是一种脚本语言。所以我想使用MATLAB的脚本端。在MATLAB中,您可以动态创建属性并为其分配属性。我想知道的是,对于非动态属性,是否也可以这样做?
>> A = POC(1);
l>> A.prop
Error using POC/get.prop (line 17)
Property "prop" not accessible when POC.arg == 1 
>> A = POC(2);
>> A.prop
ans =
    'some value'