Main Content

定义具有常量值的类属性

定义命名常量

您可以通过创建定义常量属性的 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 的具有字段 ConstMapPropstruct

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 classes
MyProject.ProjectInfo.Department
ans =

Engineering

仅当属性声明为 Constant 时,您才能将定义类的实例赋作属性的默认值。

常量属性 - 不支持 get 事件

常量属性不支持属性 PreGetPostGet 事件。如果您将 Constant 属性的 GetObservable 特性设置为 true,则 MATLAB 会在类初始化期间发出警告。

相关示例

详细信息