定义具有常量值的类属性
定义命名常量
您可以通过创建定义常量属性的 MATLAB® 类来定义可以按名称引用的常量。
常量属性可用于定义可以按名称访问的常量值。通过在属性代码块中声明 Constant
特性,创建具有常量属性的类。设置 Constant
特性意味着,一旦初始化为属性代码块中指定的值,就无法更改该值。
为常量属性赋值
为 Constant
属性赋值,包括 MATLAB 表达式。例如:
classdef NamedConst properties (Constant) R = pi/180 D = 1/NamedConst.R AccCode = '0145968740001110202NPQ' RN = rand(5) end end
MATLAB 在加载类时计算表达式。因此,MATLAB 赋给 RN
的值是调用 rand
函数后所得的结果,该值不会因随后对 NamedConst.RN
的引用而更改。调用 clear
classes
会导致 MATLAB 重新加载类并重新初始化常量属性。
引用常量属性
使用类名和属性名称引用常量:
ClassName.PropName
例如,要使用在上一节中定义的 NamedConst
类,请引用表示从度到弧度转换的常量 R
:
radi = 45*NamedConst.R
radi = 0.7854
常量包
要创建可以按名称访问的常量值的库,请首先创建一个包文件夹,然后定义各种类来组织常量。例如,要实现一组用于进行天文计算的常量,请在名为 constants
的包中定义 AstroConstants
类:
+constants/@AstroConstants/AstroConstants.m
该类定义一组已经赋值的 Constant
属性:
classdef AstroConstants properties (Constant) C = 2.99792458e8 % m/s G = 6.67259 % m/kgs Me = 5.976e24 % Earth mass (kg) Re = 6.378e6 % Earth radius (m) end end
要使用这组常量,请用完全限定的类名引用它们。例如,以下函数使用在 AstroContants
中定义的一些常量:
function E = energyToOrbit(m,r) E = constants.AstroConstants.G * constants.AstroConstants.Me * m * ... (1/constants.AstroConstants.Re-0.5*r); end
将包导入函数中即无需重复包名称(请参阅 import
):
function E = energyToOrbit(m,r) import constants.*; E = AstroConstants.G * AstroConstants.Me * m * ... (1/AstroConstants.Re - 0.5 * r); end
把句柄对象赋予常量属性
如果类使用句柄对象值来定义常量属性,则可以为句柄对象属性赋值。要访问句柄对象,请创建一个局部变量。
例如,ConstMapClass
类定义常量属性。常量属性的值是句柄对象(containers.Map
对象)。
classdef ConstMapClass < handle properties (Constant) ConstMapProp = containers.Map end end
要将当前日期赋予 Date
键,请从常量属性返回句柄,然后使用赋值语句左侧的局部变量进行赋值:
localMap = ConstMapClass.ConstMapProp
localMap('Date') = datestr(clock);
您无法在赋值语句的左侧使用对常量属性的引用。例如,MATLAB 将以下语句解释为创建名为 ConstMapClass
的具有字段 ConstMapProp
的 struct
:
ConstMapClass.ConstMapProp('Date') = datestr(clock);
把任何对象赋予常量属性
您可以将定义类的实例赋给常量属性。MATLAB 在加载该类时创建赋给常量属性的实例。仅当定义类是 handle
类时,才可使用这种编程方式。
MyProject
就是此类的一个示例:
classdef MyProject < handle properties (Constant) ProjectInfo = MyProject end properties Date Department ProjectNumber end methods (Access = private) function obj = MyProject obj.Date = datestr(clock); obj.Department = 'Engineering'; obj.ProjectNumber = 'P29.367'; end end end
通过 Constant
属性引用属性数据:
MyProject.ProjectInfo.Date
ans = 18-Apr-2002 09:56:59
由于 MyProject
是句柄类,因此您可以获取赋给常量属性的实例的句柄:
p = MyProject.ProjectInfo;
使用此句柄访问 MyProject
类中的数据:
p.Department
ans = Engineering
使用此句柄修改 MyProject
类的非常量属性:
p.Department = 'Quality Assurance';
p
是赋给 ProjectInfo
常量属性的 MyProject
实例的句柄:
MyProject.ProjectInfo.Department
ans = Quality Assurance
清除该类会导致将 MyProject
的新实例赋给 ProjectInfo
属性。
clear MyProject
MyProject.ProjectInfo.Department
ans = Engineering
仅当属性声明为 Constant
时,您才能将定义类的实例赋作属性的默认值。
常量属性 - 不支持 get 事件
常量属性不支持属性 PreGet
或 PostGet
事件。如果您将 Constant
属性的 GetObservable
特性设置为 true
,则 MATLAB 会在类初始化期间发出警告。