我可以声明一个接受名称-值参数来定义不可变属性的构造函数吗?

问题描述 投票:0回答:2

自 MATLAB R2019b 起,可以从类属性中声明名称-值参数,这创建了一种优雅的方式来定义类,可以通过声明其属性来构造该类,而无需在构造函数的代码中重复每个已定义的属性:

classdef C < handle & matlab.mixin.SetGet
    properties
       Prop
    end
    
    methods
        function obj = C(props)
            arguments
                props.?C
            end
            set(obj,props)
        end
    end
end

然后可以这样实例化:

>> C(Prop = 1)

ans =

  C with properties:
  
    Prop: 1

如果我需要属性不可变,那么如何巧妙地做到这一点就变得不太清楚。简单地将

properties
更改为
properties (SetAccess = immutable)
是不好的,因为
.?
语法似乎只支持公共可设置属性,因此尝试实例化然后会导致错误:

Error using C
Invalid argument list. Function 'C constructor' does not accept input arguments because class 'C' referenced in the arguments block does not have public settable properties.

在这种情况下,可以将

props.Prop
显式声明为名称-值构造函数参数,并将每个属性一一分配给对象,但是随着类属性变得越来越多,这种代码耦合变得更加臃肿且难以维护.

有更直接的方法吗?

matlab constructor immutability argument-validation
2个回答
1
投票

对于构造函数没有其他重复参数的类,可以通过定义重复参数和使用动态下标分配的值来复制名称-值参数模式:

classdef C < handle
    properties (SetAccess = immutable)
       Prop
    end
    
    methods
        function obj = C(name,value)
            arguments (Repeating)
                name (1,1) string
                value
            end

            for ii = 1:numel(name)
                obj.(name{ii}) = value{ii};
            end
        end
    end
end

与具有公共可设置属性的

.?
语法不同,它将参数分配给
struct
,它不能与构造函数的其他重复参数结合使用,因此不允许灵活的函数签名,但会填充在许多情况下,这似乎是一个差距。


0
投票

从 MATLAB R2024a 开始,问题中给出的示例现已受支持,因此无需任何解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.