前言
主要总结面向对象编程中的基本常见写法在matlab中是怎样的,方便以后查阅。
一个代码片段
classreg.learning.FullClassificationRegressionModel
classdef FullClassificationModel < ...
classreg.learning.FullClassificationRegressionModel & classreg.learning.classif.ClassificationModel
% 属性
% 可读,只有其子类可以写
% 该属性需要自定义读写函数
properties(GetAccess=public,SetAccess=protected,Dependent=true)
%Y True class labels used to train this model.
% The Y property is an array of true class labels. Y is of the same type
% as the passed-in Y data: a cell array of strings, categorical, logical,
% numeric or a character matrix.
%
% See also classreg.learning.classif.FullClassificationModel.
Y;
end
methods
function y = get.Y(this)
y = labels(this.PrivY);
end
end
% 方法 读写权限继承都是protected
methods(Access=protected)
% 与类同名,构造函数
% matlab中不支持函数重债,需要通过传入参数个数或varargin来实现
function this = FullClassificationModel(X,Y,W,modelParams,...
dataSummary,classSummary,scoreTransform)
% 先调用基类的构造函数
this = this@classreg.learning.FullClassificationRegressionModel(...
dataSummary,X,Y,W,modelParams);
this = this@classreg.learning.classif.ClassificationModel(...
dataSummary,classSummary,scoreTransform,[]);
this.ModelParams = fillIfNeeded(modelParams,X,Y,W,dataSummary,classSummary);
end
end
% 方法属性 Static 类方法
methods(Static,Hidden)
function [X,Y,W,userClassNames,nonzeroClassNames,rowsused] = ...
processClassNames(X,Y,W,userClassNames,allClassNames,rowsused)
% 此处省略很多字
end
end
end
继承
代码片段的首行表示类FullClassificationModel
继承了两个类FullClassificationRegressionModel
、ClassificationModel
,用classdef A < B & C 表示。
需要说明的是,matlab中的对象的继承方式都是public,即对继承方式没有限制。
属性(properties)
在MATLAB类的property块定义中,可以为属性直接赋一个值,此时为默认值。 如果默认值的赋值使用表达式,该表达式仅在类定义被MATLAB装载时执行一次,所以表达式计算的结果最好是固定。
常量(Constant)属性
在对象生存周期中值保持不变的属性,如果对该属性进行修改都将报错。 定义constant property需要用constant关键词。如果不显示给定常量属性一个特定的值,则默认为empty double。另外constant property不用创建对象就可以直接使用类中的常量。
非独立(Dependent)属性
定义:其值依赖于其他的属性,一旦其他的属性改变,该属性也做响应的变化,在概念上可以理解为
数学中的因变量。为了不需要每次都在自变量变化之后更新因变量,可以把该值设为dependent(依
赖)属性。
dependent属性特点:对象内部没有给属性分配物理的存储空间,每次该属性被访问时,其值将被动
态地计算出来。计算该属性的方法由get提供。
隐藏(Hidden)属性
隐藏的效果是在命令行中查看对象的信息时,该属性不会被显示出来。
类的方法(Method)
构造函数
和类的名称相同,用来创造类的实例。类定义中只能有一个constructor。constructor只能有一个返回值,且必须是新创建的对象。matlab中不支持函数重载,需要通过判断参数的个数nargin或借助varargin来实现。
析构函数
在对象脱离作用域或者被销毁时,负责收尾工作,比如关闭文件句柄、释放数据所占内存空间等。MATLAB规定:这类方法要命名为delete。无论Value或者Handle都需要用户定义自己的delete函
数。
抽象函数(虚函数)
- 使用关键词
Abstract
来定义。 - 定义抽象方法,只需要一行声明,不需要具体代码,并且该类的子类包括有一个同名的非抽象的办 -法。
- matlab中的含抽象函数的抽象类,不能被实例化出对象的类,可以有构造函数,只是不能利用这个构造函数声明出对象来,该构造函数一般被子类构造函数所调用,需要显式调用。
- 抽象类的子类必须实现抽象类中定义的所有抽象办法,否则,该子类仍然是抽象类。
静态(Static)方法
也叫作类方法,它为类服务,最明显的特征就是不需要对象就能使用。因为类的Constant Property
同样也为类服务,而不属于某个对象,所以静态方法可以访问类的Constant Property
。类中的普通
方法可以访问静态方法,只需要在方法前面加上类名。
访问权限控制:
- Access=private:表示只有该
类的成员方法
可以访问该数据,而子类和其他外部函数无法访问
该成员变量。 - Access=protected:表示只有该
类的成员方法
还有该类的子类
而已访问该数据。 - Access=public:在类的定义中、类的成员方法、子类的成员和方法都可以访问这个成员变量,类之外的函数或者脚本也可以访问这个成员变量。
禁止继承
使用关键词sealed
classdef (sealed) A
end
- 另一个办法就是把构造函数声明成private的,由于子类对象的建立必须要访问父类的构造函数,而
private的构造函数将禁止子类的访问,所以该错误会出现在运行时,从而达到禁止继承的目的。 - 基类的作者要确保该方法不被覆盖时,也可以在基类方法中使用Sealed关键词。
如何共享变量?
MATLAB不支持static变量。如果要让类的各个对象共享变量,可以在静态成员方法中定义一个persistent变量。比如可以用一个persistent变量计算对象创造的数量。
MetaClass:用一种普遍的方式来描述类
- 获得一个类的meta.class对象
- 已知类的名字,可以在类名前面加上一个问号来获得meta.class
例如:metaObj=?FileIterator
。 - 有了一个类的对象,可以用meta.class函数来获得meta.class对象。
如:metaObj=metaclass(obj);
- 第三种方法最灵活:如果类的名字是以字符串的形式存在的,可以利用meta.class类中的成员方法
fromName
,该函数接受string input,返回meta.class对象。
例如:
name='Vehicle';metaObj=meta.class.fromName(name);
- 已知类的名字,可以在类名前面加上一个问号来获得meta.class
meta.class可以做什么?
系统地获得类中所有property的名字。metaobj=?Derived;
propNameList={metaobj.PropertyList.Name} `- metaobj.PropertyList是一个对象数组,其中的内容是meta.property的对象
- 使用.语法可以向量化访问数组中对象的共同属性
- metaobj.PropertyList.Name返回的结果是string类型,由于string的长度不同,使用
{}
把返回的结果收集到元胞数组中去。