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的时候计算出来。