set 和get 方法是为对象属性赋值和访问的一个中间层,当我们运行代码 a.x的时候,其实会隐性的调用set.x()方法,下面我们来介绍如何自定义set和get方法。

set方法

Handle类

classdef Point < handle
  properties
    x = 0
    y = 0
  end
  properties (Hidden,Dependent)
      r
  end
  methods
    function obj = Point(x,y)  % 可以使用nargin得到复杂初始化
        obj.x  = x;
        obj.y = y ;
    end
    function disp(obj)  % 自定义显示方法
       disp('------------------');
       s = sprintf('坐标为(%3.3d,%3.3d)\n',obj.x,obj.y);
       disp( [s 'obj.disp was called.'])
    end
    function r = get.r(obj)  % get方法获取r的信息
        r = sqrt(obj.x^2+obj.y^2);
    end
    function set.x(obj,var)  % 用set 方法可以限制随意赋值
    if var > 0
        obj.x = var;
    else
        error('x应为正数');
    end
    end
  end
  end

上面的 set方法有两个输入参数,没有输出参数,其限制了x的范围必须大于0,否则无法复制,这样有利于防止bug产生,未自定义set方法实际上采用默认set方法即:

function set.x(obj,var)
obj.x = var;
end

运行代码 a = Point2(-1,1,1);查看效果:

Value类

value类和Handle类的set函数一个重要的区别就是有没有输出,我们在之前说过,value类的输入参数是深拷贝,独立于原来的参数,在函数体外会销毁,无法改变原来的值,因此我们需要将上面的set函数改成:

function obj = set.x(obj,var)
 if var > 0
        obj.x = var;
    else
        error('x应为正数');
    end
end

比如我们有下面的定义:

classdef Point
    properties
        x = 1;
    end
    methods
        function obj = set.x(obj,var)
                obj.x = var + 1;          
        end
    end
end

get方法

我们在访问属性的时候,会隐性的调用get方法,Value类和Handle类的get方法一致。

classdef Point < handle
  properties
    x = 0
    y = 0
  end
  properties (Hidden,Dependent)
      r
  end
  methods
    function obj = Point(x,y)  % 可以使用nargin得到复杂初始化
        obj.x  = x;
        obj.y = y ;
    end
 function r = get.r(obj)  % get方法获取r的信息
        r = sqrt(obj.x^2+obj.y^2);
    end
  end

这里的r是Dependent属性,只能访问而不能赋值。

r 会在访问 r 的时候计算出来。