在一般情况下,定义类的属性和方法的时候,方法需要在类体中定义。但是当函数体过长会使得类的定义显得十分臃肿,所以需要将一些方法单独拿出来,而且在一个程序中可能需要很多类,不应该将所有类都放在当前路径上,需要进行包装。

接上文,假设我们需要定义一个基类 Point,除了构造函数还有一个类方法为 normalize(), 和display(),那么组织结构为:

放置类体的文件夹为 @+类名,在文件夹下可以放置类相关的函数和类的定义。

% Point.m
classdef Point < handle
  properties
    x = 0
    y = 0
  end
   properties (Hidden,Dependent)
      r
  end
  methods
    normalize(obj);  % normalize的定义在外面
    function obj = Point(x,y)  % 可以使用nargin得到复杂初始化
        obj.x  = x;
        obj.y = y ;
    end
    function disp(obj)  % 自定义显示方法
       disp('------------------');
       s = sprintf('坐标为(%3.3d,%3.3d)\n',obj.x,obj.y);
       disp( [s 'obj.disp was called.'])
    end
    function r = get.r(obj)  % get方法获取r的信息
        r = sqrt(obj.x^2+obj.y^2);
    end
  end
    end

在上面的代码中,只在methods当中声明了函数,但是没有给出具体定义,在同一路径下再定义一函数normalize.m有:

% normalize.m
    function normalize(obj)
    obj.x = obj.x/r;
    obj.y = obj.y/r;
    end

这两个文件都在文件夹@point中,然后main函数与@point在同一路径中,即可使用。

当有多个类时,同样可以分多个文件夹

当程序更复杂的时候可以考虑使用包package:

这样的话,在使用包中的类时,需要加上包名,比如:

classdef Point2 < myPackage.Point
 a = myPackage.Point2()

如果要导入包中的所有类,可以用import导入,比如:

import myPackage.*
a = Point2();