属性 get 和 set 方法
您可以定义属性 get 和 set 方法,每当访问关联的属性时,MATLAB® 都会自动调用这些方法。要将 get 或 set 方法与给定的属性相关联,请分别使用 get.
和 PropertyName
set.
形式来命名 get 和 set 方法。 PropertyName
除了访问属性之外,get 和 set 方法还可以执行额外的步骤操作。使用 get 方法可以:
计算从属属性的值。
以不同于呈现给用户的格式存储数据。
使用 set 方法可以:
设计比内置验证方法支持的更复杂的属性验证。
发出自定义错误消息。
执行作为属性值更改直接结果的操作,如建立或更新与硬件设备的连接或打开文件,从而确保对资源的访问。
get 和 set 方法确实会增加类的开销。在频繁访问的属性的 get 和 set 方法中,请避免复杂和计算量大的运算。
注意
您无法直接调用本主题中所述的 get 和 set 方法。当您访问属性值时,MATLAB 会自动调用这些方法。有关实现用户可调用的 get 和 set 方法的信息,请参阅为属性实现 set/get 接口。
属性 get 方法
您可以定义一个 get 方法,以便每当查询关联的属性值时,MATLAB 都会自动调用该方法。该 get 方法必须返回属性值。get 方法使用如下语法,其中 PropertyName
是属性的名称。
methods function value = get.PropertyName(obj) ... end end
定义 get 或 set 方法的方法块无法指定属性。
例如,triangleArea
类为 Area
属性定义 get 方法。Area
定义为从属属性,这意味着它不存储值。Area
的 get 方法按需计算值。(有关从属属性的详细信息,请参阅从属属性的 get 和 set 方法。)
classdef triangleArea properties Base = 1 Height = 1 end properties (Dependent) Area end methods function a = get.Area(obj) disp("Executing get.Area method.") a = 0.5*obj.Base*obj.Height; end end end
创建一个 triangleArea
的实例。
a = triangleArea
a = Executing get.Area method. triangleArea with properties: Base: 1 Height: 1 Area: 0.5000
当显示对象时,MATLAB 为其显示的属性调用任何已定义的 get 方法。在本例中,它调用 get.Area
,并根据 Base
和 Height
的默认值计算 Area
的值。如果 get 方法出错,MATLAB 会隐藏错误并从显示中省略该属性。
更改 Base
和 Height
的值,并再次访问 Area
。
a.Base = 3; a.Height = 4; a.Area
Executing get.Area method. ans = 6
get 方法用法
get 方法不以递归方式调用。
当复制值对象(即不从
handle
类派生)时,在将属性值从一个对象复制到另一个对象时,不调用 get 方法。
属性 set 方法
您可以定义一个 set 方法,以便每当关联的属性赋值时,MATLAB 都会自动调用该方法。根据类是值类还是句柄类,set 方法使用以下语法:
值类 set 方法必须返回修改后的对象。
methods function obj = set.PropertyName(obj,value) ... end end
句柄类 set 方法不需要返回修改后的对象。
methods function set.PropertyName(obj,value) ... end end
定义 get 或 set 方法的方法块无法指定属性。
例如,symPosDef
使用一个 set 方法进行属性验证。当 inputMatrix
属性设置为新值时,set 方法调用 chol
函数以确定输入矩阵是否为对称正定矩阵。如果是,该方法将 inputMatrix
设置为该值。如果不是,该方法将返回一条自定义错误消息。
classdef symPosDef properties inputMatrix = [1 0; 0 1] end methods function obj = set.inputMatrix(obj,val) try chol(val) obj.inputMatrix = val; catch ME error("inputMatrix must be symmetric positive definite.") end end end end
创建一个 symPosDef
的实例,并尝试将 inputMatrix
设置为非对称正定矩阵的值。
s = symPosDef; s.inputMatrix = [1 2; 1 1]
Error using symPosDef/set.inputMatrix inputMatrix must be symmetric positive definite.
set 方法用法
set 方法不以递归方式调用。
MATLAB 在对象初始化期间向属性赋予默认值时,不调用 set 方法。但是,在构造函数中设置属性值会调用 set 方法。
MATLAB 在加载对象时调用 set 方法。
当 MATLAB 复制值对象(任何非
handle
对象)时,在将属性值从一个对象复制到另一个对象时,不会调用 set 方法。如果定义属性时其
AbortSet
特性等于true
,则在所赋的值与当前值相同时,不会调用该属性的 set 方法。但是,如果该属性具有 get 方法,会调用 get 方法以便可以比较这些值。有关此属性的详细信息,请参阅Assignment When Property Value Is Unchanged。