Main Content

属性 get 和 set 方法

您可以定义属性 get 和 set 方法,每当访问关联的属性时,MATLAB® 都会自动调用这些方法。要将 get 或 set 方法与给定的属性相关联,请分别使用 get.PropertyNameset.PropertyName 形式来命名 get 和 set 方法。

除了访问属性之外,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,并根据 BaseHeight 的默认值计算 Area 的值。如果 get 方法出错,MATLAB 会隐藏错误并从显示中省略该属性。

更改 BaseHeight 的值,并再次访问 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

相关主题