本系列内容为《MATLAB面向对象编程–从入门到设计模式》学习笔记,特此说明。
如果想要在其他路径上使用一个类,需要使用addpath命令,把包含该类的文件夹加到当前MATLAB搜索路径中区。
e.g. Point.m 存储在:E:\MATLAB\floder1目录中;
addpath('E:\MATLAB\folder1');
p1=Point(1.0,1.0);
addpath函数还可以接受文件夹的相对路径作为参数。
MATLAB支持一种定义类的方法,适用于类成员方法较多的情况。即,在类的定义文件中提供方法的声明(Declaration),而不提供方法定义(Definition),即把方法的定义放到另一个独立的 .m 文件中去。
把类的定义和成员方法的定义分开,有利于开发复杂的面向对象程序。
e.g. 以Point2D为例。
MATLAB规定,如果要把方法的定义normalize 和 disp 放在单独的文件中,那么类的定义Point.m、normalize,m和display.m必须放在一个以@开头的文件夹中,且该文件夹必须命名为@Point。
类方法display和normalize的定义从外观上看和普通的函数很像,其区别主要在于,这些类方法可以访问对象的私有数据,而普通的类方法不可以。下图为@Point文件夹中的内容 。
e.g. Point.m文件中的“[norm] = normalize(obj);”时成员方法的声明。该声明告诉MATLAB解释器,这个方法的参数列表在哪里可以找到。
MATLAB规定,normalize方法的声明仍要放在method block中,并且成员方法声明前面不需要function关键词。
Tips:哪些方法的定义一定要放在类定义中?
一般来说,放在@文件夹中的任何方法都被默认为类的成员方法,甚至不论该方法是否已在类定义中声明。
Tips:如何使用@Point中类的定义?
如果main程序需要使用Point类的定义,则@Point文件夹需要放在和main程序同一目录下,使用起来和普通类定义中放置全部的方法定义没有任何区别。
更常见的做法还是用addpath函数把@Point文件夹添加到MATLAB的搜索路径中,这样在任何路径下都可以使用PointClass的类定义了。
在类的定义中,可以定义局部函数(Local Function)。局部函数不是类的方法,在类的定义外部不可见,不能通过obj.method的方法从外部访问,局部函数仅对被类定义内部的方法可见。
规定,局部函数的定义,即函数体,需要放在classdef ...end后面。
e.g.
classdef Point < handle
properties (Access = private)
x
y
end
methods
function obj = Point(x,y)
[obj.x obj.y] = localUtility(); %调用该文件中的局部函数
...
end
...
....
end
end %classdef block end
%Point类定义中的局部函数
function [x y] = localUtility()
......
end
从功能上来说,局部函数一般作为工具(Utility)函数存在,提供一些功能,但不足以特殊到要称为一个类的方法。
从语法上来说,局部函数对函数参数的要求没有限制,不像类的实例方法那样,参数中一定要包含一个对象。如果有需要,局部函数中的参数可以包换类的对象,这样局部函数就可以访问对象的私有属性了。
所有在同一文件中定义的类方法都能调用局部函数的方法,但那些只有声明没有定义的类方法除外。
在classdef外部定义的类的方法也可以拥有自己的局部函数,其调用规则与类的局部函数类似。
各个类进一步可以组成Package,如下图所示。
MATLAB规定,Package文件目录必须以加号 “+”开头,Package中还可以包括各个类的文件夹,各类之间还可以有继承关系。
e.g. Point3D继承了Point2D,如果 要在Point3D中使用Point2D类,需要在前面加上Package的名称。
[email protected](x,y);
Tips:如何使用Package中的某个类
如果一个类的定义是放在Package中的,则使用该类时需要在类名前加上Package的名称。
p1=PointPackage.Point2D(1,1);
p2=PointPackage.Point3D(1,1,1);
Tips:如何导入Package中所有类
使用import命令可以导入整个Package。
调用Package中类不需要使用Package 的名字了。
e.g.
import PointPackage.*;
p1=Point2D(1,1);
p2=Point3D(1,1,1);
p2.display();