本帖最后由 TS-boys 于 2020-10-30 13:29 编辑
1. 引子
面向对象编程是一种非常流行的编程思想,将“数据/属性”和“方法/函数”打包为对象,有利于大型软件的维护。基于这种思想,不同的编程语言,比如C++、JAVA等进行了不同的诠释。MATLAB也同样,对这种编程思想提供了支持,且有增加的趋势。
2. 基本的面向对象编程
2.1 创建一个对象
非常简单的创建方法,与新建函数或脚本一样,只是这里变成了新建 class。新建后会自动出现模板,在模板基础上修改即可。
p1.png (68.78 KB, 下载次数: 18)
2020-10-30 13:16 上传
2.2 对象的定义
定义一个对象,自然要有名字,classdef 后就是对象的名字。一个合法的对象名字,与MATLAB变量规则相同,字母开头、区分大小写、不能用特殊字符,例如 student 就是一个合法的对象名字。修改后直接保存,就能得到一个同名的student.m 文件,一个对象就创建好了。
2.3 数据/属性
一个对象需要包含一定的数据或属性,例如“学生”作为一个对象,姓名、年龄、分数都可能是数据。在 MATLAB 中定义数据的关键字是 properties … end 配对,关键字之间定义多个属性名即可。同样,属性名的命名规则与MATLAB变量命名规则相同。这里定义三个属性:name、age和score。
2.4 方法/函数
在面向对象编程思想中,方法/函数是对对象数据的运算或操作,用于实现特定的功能。在MATLAB 中用关键字 methods … end 配对,不同的函数用function…end 来配对。从而形成了这样的结构:
p2.PNG (29.04 KB, 下载次数: 12)
2020-10-30 13:16 上传
2.4.1 构造器
如果是通过 JAVA 学习面向对象编程的话,最常听到的一个概念就是构造器,每个对象在实例化的过程中,第一个调用的就是构造器。MATLAB中也有类似的概念,将 function 的名字和 classdef 的名字设定为一样,就相当于构造器了。有些语言中可以定义多个构造器,在MATLAB中只能定义一个。如果实例化时需要用不同的输入参数个数,来调用不同的构造器,则可以在构造器中通过switch nargin 来实现。后面的例子中,会用这个方法实现student对象的四个构造器
2.4.2 get/set方法
说到对象的方法,get和set都是非常常见的。对get方法而言,输入一个对象的实例,返回其属性值,因此函数定义一般是 function property_value=get_property(obj),在函数中,只需要对输出变量进行赋值即可。对set 方法而言,输入一个对象的实例及其需要修改属性的新值,返回修改后的对象实例,因此函数定义一般是 function obj=set_property(obj,value),此时调用后,会返回一个新的对象实例。
3. 例子
这里是一个student对象的例子,在 r2020a 上测试的,但只要不是太旧的版本,应该都可以用。
student.m
(1.09 KB, 下载次数: 1)
2020-10-30 13:29 上传
点击文件名下载附件
3.1 属性
如前所述,一共定义了三个属性,姓名、年龄和分数。
3.2 方法
构造器的定义是:function obj =student(name,age,score),函数名与对象名一致。构造器的第一句是switch nargin,即判断输入参数的个数。如果调用时,没有输入参数,那么就返回一个student对象,其名字为空、年龄18、分数0。如果调用时,输入了若干参数,那么就返回一个部分有内容的对象。
get/set的定义与之前说的一致,getname和setname用于对对象的姓名进行操作。
newyear是一个普通的方法,假设新学期到了,对student的年龄加一,对其分数进行清空。
3.3 使用
可以通过以下脚本来使用 student 对象
student1=student() %建立对象
name=student1.getname %获取对象name属性
student1=student1.setname('xiaoli') %set对象name属性
student1=student1.newyear %对象进行newyear操作复制代码
4. 扩展
针对r2020a版本,完整说明:
这里补充一些常用的特性
4.1继承
只需要在定义对象的时候声明即可,例如 classdef math_student< student 就可以定义学生的子类,数学系学生。
4.2权限控制
属性和方法都可以进行权限控制,例如 methods (private) 可以定义私有方法,因此一个classdef下,可能有多个 properties…end 和 methods …end 段落,用来控制不同权限的属性和方法。
4.3本地函数
虽然用了 classdef 开头,但本质还是 m 文件,因此可以使用本地函数,即在文件末尾追加定义 function y=xxx(x)来定义一些函数。这些函数仅在本文件范围内有效。