matlab是否可以面向对象,MATLAB中的面向对象编程

本帖最后由 TS-boys 于 2020-10-30 13:29 编辑

1. 引子

面向对象编程是一种非常流行的编程思想,将“数据/属性”和“方法/函数”打包为对象,有利于大型软件的维护。基于这种思想,不同的编程语言,比如C++、JAVA等进行了不同的诠释。MATLAB也同样,对这种编程思想提供了支持,且有增加的趋势。

2. 基本的面向对象编程

2.1 创建一个对象

非常简单的创建方法,与新建函数或脚本一样,只是这里变成了新建 class。新建后会自动出现模板,在模板基础上修改即可。

matlab是否可以面向对象,MATLAB中的面向对象编程_第1张图片

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 来配对。从而形成了这样的结构:

matlab是否可以面向对象,MATLAB中的面向对象编程_第2张图片

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 上测试的,但只要不是太旧的版本,应该都可以用。

6712fa43d918eeacb445e51bf896eabe.gif

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)来定义一些函数。这些函数仅在本文件范围内有效。

你可能感兴趣的:(matlab是否可以面向对象)