电子说
01
定义类
1.1 一个最简单的类
使用classdef ... end语句块来标识一段类的定义,这一点和MATLAB其他代码块的语法风格是类似的,如定义函数的function ... end、定义循环的for ... end等等。要注意类定义文件的文件名要保持和类名一致,否则MATLAB在运行时会按照类定义文件名作为可被识别的标识符。
如下面这个示例中,定义了Student类,以及它的属性和方法。这个实例展示了定义类的最简单的方法,MATLAB还提供了很多高级的类特性定义方法,接下来的章节会逐一介绍。
1.2 类文件组织
对于一个简单类来说,所有的方法实现可以放在同一个类文件中。但是随着类实现的功能逐渐庞大,就可以把某一个类方法的实现单独放在一个类方法文件中,和类定义文件一起放在以<@类名>的类文件夹下。同时,通过把类文件或者普通函数文件放在以<+包名>的包文件夹下,可以让类有独立的名称空间。使用包文件夹中的类或者函数时,必须加入包名和点操作符修饰(包括包内的类在使用包中其他类时也要使用包名修饰,不会因为在同一个包内就能搜索到)。
02
类属性
2.1 属性特性
通过属性特性来约束属性的行为,语法是在属性关键字之后添加小括号括起的键值对。常用的属性特性有Access、Constant、GetAccess、SetAccess等。当用户不指定属性特性时,它们有各自的默认值,如Access默认就是public。
2.2 属性验证
MATLAB是一种弱类型的语言,一般情况下MATLAB会做自动类型推断。MATLAB提供了很多方式来验证属性满足用户的某种需求,如必须是string类型、必须满足一定的维度要求、必须大于某一数值等。这些都是通过类的属性验证语法来实现的。
这里额外提一下属性验证函数,除了自带的一些属性验证函数(如mustBePositive、mustBeGreaterThan、mustBeNumeric)等,还允许用户自定义属性验证函数,这些属性验证函数放在和类定义的语句之后。
03
类方法
3.1 方法调用
和C++不同的是,MATLAB没有传递给类方法的隐藏类对象,如this指针,必须将类的对象显式传递给方法。对于普通方法,通常第一个参数用于传递类对象,也通常写作obj。这一点和python的__init__(self, ...)很像。调用方法时,可以使用函数式或者点操作符,这里我认为函数式调用方法是MATLAB的特色。函数式调用方法时,会涉及到对象匹配的优先级判定,因为不同的对象可能会存在同名的方法,由MATLAB的内部机制决定执行哪个类对象的方法。
** 3.2 方法特性**
和属性特性一样,也可以对方法指定不同的特性。常用的特性参数如Access、Static。这里特别提一下Static参数,当Static = true时,方法为静态方法,不需要使用类对象的任何属性参数。静态方法通常作为实现类的功能函数存在。类似的函数还有类相关函数,即放在同文件下,类定义之后的局部函数。
注意这里grow方法返回了对象本身,这是因为如果修改了类对象的属性,需要返回对象本身才能体现修改。猜测这是因为MATLAB的函数是按值传递的特性造成的,因此修改对象后必须返回对象的副本。如果对象继承自handle类,那么可以避免这一步,handle类是按引用传递的。
3.3 函数重载
重载 MATLAB 函数的方法是定义一个与要重载的函数同名的类方法。在类实例中调用该函数时,MATLAB 会调度该类方法。还可以通过用适当的名称定义类方法来重载 MATLAB 算术、逻辑、关系和索引运算符。这些运算符有对应的特殊函数名,如运算符 + 对应的内建函数就是plus。
3.4 构造函数
构造函数是一种特殊的类方法,和类同名,且必须放在类定义文件中,不可以放在单独的文件中。可以在构造函数中使用其他函数一起完成构造。
3.5 创造对象数组
MATLAB类对象支持定义数组特性。在C++中,需要定义一个对象数组来保存各个对象的指针,但是MATLAB类对象本身就支持多维特性。通过在构造时指定对象的维度,可以返回多维的对象数组。
这里需要注意的是,使用obj(m, n) = obj的语法时,已经改变了对象的维度属性,因此必须返回新的obj对象,哪怕继承了handle类。这一点在构造函数使用了其他辅助函数时特别容易忽视和犯错。
04
总结
MATLAB面向对象编程为组织大型工程提供了基础,同时它的OOP特性和其他语言也有所不同
全部0条评论
快来发表一下你的评论吧 !