本系列内容为《MATLAB面向对象编程–从入门到设计模式》学习笔记,特此说明。
public、protected和private权限
从面向过程到面向对象,最显著的区别是,把数据和函数捆绑在一起形成了类,数据变成了属性,函数变成了类的成员方法。
就数据而言,并不是所有被捆绑的数据都有必要提供给外部访问,所以需要对访问权限进行控制。
就程序设计而言,为了尽量避免一个类中的某个行为干涉同一系统中其他类,应该让类仅公开必须让外部知道的内容,而隐藏其他一切不必要的内容,这也叫封装。
Matlabt提供了关键词“Access = private , protected , public”来声明哪些属性和方法是可以公开访问的、受保护的、或者不可以公开的,也就是私有的。
classdef SomeClass < handle
properties(Access = private) %类的私有属性
prop_private
end
properties(Access = protected) %类的保护属性
prop_protected
end
properties %默认情况下是公有(public)的属性
prop_public
end
methods(Access=private or protected or public)
function result = SomeFunction(obj)
...... %代码省略
end
end
end
如果一个属性的特性被设置成 Access = private,这表示只有该类的成员方法可以访问该数据,而子类和其他外部函数或者脚本都无法访问到该成员变量。这也是类方法和普通函数的重要区别之一:类方法可以访问对象中的私有属性。
如果一个属性的特性被设置成 Access = protected ,则表示只有该类的成员方法,还有该类的子类可以访问该数据。
如果一个属性的特性采用默认值,即public,则表示不但在类的定义中,该类的成员方法以及该类的子类的成员方法都可以访问这个成员变量,而且在类之外的函数或者脚本也可以访问这个成员变量。
对于属性的访问权限,还可以再细分成赋值SetAccess和查询GetAccess的权限
......
properties (SetAccess =private,GetAccess = public)
var %说明该属性可以被外界程序查询值,但不能被外部程序赋值,赋值只能在类的内部进行
end
......
tips:
在类内部方法中,可以对属性进行任意访问,没有权限之分。
在属性的定义中,因为MATLAB对所有访问权限的默认值都是public,所以省略 GetAccess = public。
在实际计算中存在这样的需求:一个类的内部数据总的来说是私有的,但要求允许个别的类访问或修改。
classdef A < handle
properties (SetAccess = {?B}) %该属性只允许B对象来修改
val1
end
properties(Access = {?C}) %改属性只允许C对象来访问,对其他对象函数都相当于private
val2
end
end
......