|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 {. |' D* W% A" W: y( P
类(class)封装是C++语言最显著的特征!但是很少听说MATLAB中类的概念,这里悄悄的告诉的大家,其实MATLAB也支持面向对象编程,只是使用的人不多而已。% V! F9 Z+ h7 s' K
% F7 G! C; A1 e: R3 G对于编写一般简单的数学算法程序,当然基本用不到面向对象编程的概念,所以也就不需要使用MATLAB的类定义了。可是如果应用MATLAB开发具有工程应用型的程序,使用面向对象编程会具有不可比拟的优势。
* C% K1 Z9 ^$ q! Z, b% H5 x; _2 \+ m8 {6 ^9 m3 i1 ~) ^0 @5 P
懂C++的朋友应该都知道,C++有一个static成员,static成员是独立于具体的类对象的,是该类所有实例(instance)共享的。这个static成员有什么好处呢?static成员变量是用来存储公共数据的,比如可以用来统计类实例的个数(因为有些类会严格控制实例的个数)或者默认参数(提供某些对象的参数),当然还可以有其它作用,自己发挥吧。static成员函数在不创建类对象的时候直接调用。1 e' g Q) V4 O% ^( H
$ I8 Y; ^' }( b, w& g很不幸的是MATLAB不支持static成员变量,只能定义static成员函数,于是很多在C++中轻而易取实现的功能,在MATLAB中却成了捉襟见肘!
1 x8 j- g- P9 @$ P# _- k5 q. r" ~) D& C0 f( A1 x
其实软件是死的,人是活的,办法总是有的,下面就来说说。假如我有一个类student,每次生成一个类对象的时候需要对student对象总数进行更新和统计。; b, f2 T+ e7 V8 M
- classdef student
- properties
- count % 统计student类对象的个数
- name % 学生姓名
- gender % 性别
- math % 数学成绩
- chinese % 语文成绩
- end
- end
+ S8 Z. Z) m: N( g2 j. c
, q2 f$ M9 u& p- M8 F( N( x" |+ R b& W' @! c+ [
上面类定义的count是具体类对象的成员变量,每个类对象的取值都可以不一样的,因此不能用来统计类对象的个数,MATLAB中只有constant变量才是独立于类对象的,于是如下修改
7 ~! f) j8 \/ Q+ v1 e% q- classdef student
- properties (Constant)
- count % 统计student类对象的个数
- end
- properties
- name % 学生姓名
- gender % 性别
- math % 数学成绩
- chinese % 语文成绩
- end
- end$ W4 x* W8 Z$ M7 x( F9 O$ Y* F
- ^* u+ B& O0 R7 F- E- @* V$ K! J
6 E# w& y; W5 t( E# ]+ @5 w9 q但是问题又来了,constant变量顾名思义,它的值是不能修改的,看来努力还是要白费了??不要灰心一切事情都有转机的,不幸中的万幸,MATLAB提供了句柄类(hande class)这个概念,句柄有点类似于C++中的指针或者引用的概念,但是两者不同,不过偶不介意你将句柄当成MATLAB中的引用。这就让我们依稀看到了黎明的曙光。
1 g3 e$ {4 E+ h9 ^8 O% I. q6 G: e# p! i, @4 ]; P x% D& o
现在假如这个constant变量是一个句柄呢,由于constant变量的值是不能修改,这是铁定的,因此引用哪个变量也是没法修改的,但是没有限定这个引用变量的内容不能修改呀。现在问题又来了,如何创建句柄呢,嗯MATLAB提供了几个超类,其中handle超类是属于句柄型的。好下面我们创建一个句柄类) s' S1 G* s$ a& ~8 U* V. g; N
- classdef (Sealed) thiscount < handle % 继承handle超类,这个必须
- properties
- number=0
- end
- methods
- function obj=thiscount(varargin) % 构造函数
- end
- function obj=add(varargin)
- obj.number=obj.number+1;
- end
- end
- end6 \7 o" V6 z6 |2 f; w; G8 [4 ]
5 W5 o; f0 @; b6 e7 ~
当然需要修改下student类了
" q* g5 E* I5 J, r; d- classdef student
- properties (Constant,Hidden)
- count=thiscount; % 统计student类对象的个数,保存了一个用于统计个数的句柄类
- end
- properties (SetAccess=private)
- index % 当前类对象的生成序号
- end
- properties
- name % 学生姓名
- gender % 性别
- math % 数学成绩
- chinese % 语文成绩
- end
- methods
- function obj=student(varargin)
- obj.AddInstance; % 调用构造函数创建student对象时,自动调用AddInstance函数进行类实例个数累加
- end
- function obj=AddInstance(varargin)
- obj.count.add;
- obj.index=obj.count.number;
- end
- end
- end3 X7 o) e4 L. g4 x; E
q$ M" Q. r( T9 j: L/ }
, `9 g! H4 d& c8 C1 U9 X
这样你每次创建一个student类,那么会自动统计,我们可以通过student.count.number来显示创建的实例个数,假设创建了一个student类对象sobj,那么可以通过sobj.index来访问当前类对象的创建编号。
% D7 n1 }5 L/ }4 X9 W4 `0 q1 R; [ |
|