自 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
显式声明为名称-值构造函数参数,并将每个属性一一分配给对象,但是随着类属性变得越来越多,这种代码耦合变得更加臃肿且难以维护.
有更直接的方法吗?
对于构造函数没有其他重复参数的类,可以通过定义重复参数和使用动态下标分配的值来复制名称-值参数模式:
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
,它不能与构造函数的其他重复参数结合使用,因此不允许灵活的函数签名,但会填充在许多情况下,这似乎是一个差距。
从 MATLAB R2024a 开始,问题中给出的示例现已受支持,因此无需任何解决方法。