MATLAB面向对象编程学习笔记----MATLAB类文件的组织结构

本系列内容为《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:哪些方法的定义一定要放在类定义中?

  1. MATLAB规定类的Constructor 和delete方法的定义必须放在类定义中。
  2. MATLAB规定任何属性的set 和 get方法的定义必须放在类定义中。
  3. MATLAB规定类的Static方法的定义必须放在类定义中。

一般来说,放在@文件夹中的任何方法都被默认为类的成员方法,甚至不论该方法是否已在类定义中声明

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文件夹管理类

各个类进一步可以组成Package,如下图所示。

MATLAB规定,Package文件目录必须以加号 “+”开头,Package中还可以包括各个类的文件夹,各类之间还可以有继承关系。

e.g. Point3D继承了Point2D,如果 要在Point3D中使用Point2D类,需要在前面加上Package的名称。

  obj=obj@PointPackage.Point2D(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();

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值