【问题标题】:Dynamically change property attributes动态更改属性属性
【发布时间】:2019-08-11 03:17:22
【问题描述】:

类 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

【问题讨论】:

  • 你是从哪里得到这个想法的?我从未见过一种 OOP 语言可以让您动态更改属性属性(除非您考虑反射,我认为这不是 MATLAB 类的问题)。正如 NewEyes 所说,我会选择 2 个不同的课程。
  • @Dev-iL in Smalltalk,一种根 OO 语言,一切都是动态定义的,类和方法
  • @Dev-iL 我知道 OOP。当然,我可以通过课程来解决。但我试图找到一个非 OO 解决方案。此外,MATLAB 与其他 OO 语言不同。根据一些观点,MATLAB 是一种脚本语言。所以我想使用 MATLAB 的脚本端。
  • 在 MATLAB 中,您可以动态创建属性并为其分配属性,nl.mathworks.com/help/matlab/matlab_oop/…。我正在寻找的是非动态属性是否可能相同?

标签: matlab properties attributes private-members


【解决方案1】:

Access 级别是固定的,就像我所知道的任何 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

输出

>> 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'

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 如果 arg1 不是 1,那么所有属性对用户都是可见的。输入对象名称后,用户将看到所有带有选项卡完成的属性。在您的解决方案中,无论构造函数中的 arg1 为何,它们都将被隐藏。
    • 啊好吧,我明白了!为什么不为每种情况使用 2 个不同的类?
    • 你是对的,但出于不同的原因我不想创建类。我有几十个属性(不仅仅是两个),我只是举了一个简单的例子来简要说明我的问题。
    • 即使你有很多属性仍然只是 ctrl+c 和 ctrl+v 并更改一行。到目前为止您还没有提到其他并发症吗?
    • @NewEyes 多个相似的类不如一个灵活的类可取的原因有很多。如果你想修改一个函数的工作方式怎么办?现在你必须在许多类文件中编辑它。我认为有更好的解决方法,或者 OP 应该考虑他们为什么要实现此功能并做一些不同的事情。
    猜你喜欢
    • 2015-08-24
    • 2017-07-28
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多