类定义位于路径上

首先最需要明确的一点就是,类定义必须位于MATLAB的文件路径上,否则将无法用于实例的创建

类和路径文件夹

有两种类型的文件夹可以包含类定义文件。

  • 路径文件夹 - 文件夹位于 MATLAB 路径上,文件夹名称不以 @ 字符开头。当您要在一个文件夹中包含多个类和函数时,请使用这种类型的文件夹。一个类的完整定义必须包含在一个文件中。
  • 类文件夹 - 文件夹名称以 @ 字符开头,后跟类名。该文件夹不在 MATLAB 路径上,但其父文件夹在该路径上。当您要使用多个文件定义一个类时,请使用此类型的文件夹。

有关 MATLAB 路径的信息,请参阅 path 函数。

包含类定义文件的文件夹位于 MATLAB 路径中。因此,放置在路径文件夹中的类定义在优先级方面的行为和任何普通函数一样 - 在 MATLAB 路径上第一次出现的名称优先于随后出现的所有相同名称。

每个类定义文件的名称必须与用 classdef 关键字指定的类的名称相匹配。使用路径文件夹就无需为每个类创建单独的类文件夹。但是,一个类的完整定义,包括所有方法,必须包含在单个文件中。

假设您在单个文件夹中定义了三个类:

.../path_folder/MyClass1.m
.../path_folder/MyClass2.m
.../path_folder/MyClass3.m

要使用这些类,请将 path_folder 添加到您的 MATLAB 路径:

addpath path_folder

类文件夹的名称始终以 @ 字符开头,后跟类名称。类文件夹必须包含在路径文件夹中,但类文件夹不在 MATLAB 路径上。将类定义文件放在类文件夹中,该文件夹也可以包含单独的方法文件。类定义文件必须与类文件夹同名(除 @ 字符外)。

.../parent_folder/@MyClass/MyClass.m
.../parent_folder/@MyClass/myMethod1.m
.../parent_folder/@MyClass/myMethod2.m

每个文件夹只能定义一个类。所有文件的扩展名均为 .m.p。对于 MATLAB 版本 R2018a 及更高版本,独立方法可以是扩展名为 .mlx 的实时函数。

当您要使用多个文件定义一个类时,请使用类文件夹。MATLAB 将类文件夹中的任何函数文件视为类的一个方法。函数文件可以是 MATLAB 代码 (.m)、实时代码文件格式 (.mlx)、MEX 函数(平台相关的扩展名)和 P 代码文件 (.p)。

MATLAB 将类文件夹中的任何文件显式标识为该类的方法。这使您能够使用更模块化的方法来编写您的类方法。

每个文件的基本名称必须为有效的 MATLAB 函数名称。有效的函数名称以字母字符开头,并且可以包含字母、数字或下划线。有关详细信息,请参阅在单独文件中定义方法

讲得有点乱,总结下来就是以下几点:

  • 大多数情况下(特别是需要多个文件去定义一个类的时候)推荐使用@的方法
  • 使用@的方法,在切换路径的时候会用新的类去重新定义旧的类

包文件夹

包是一种特殊文件夹,可以包含类文件夹、函数和类定义文件及其他包。类和函数的名称的作用域限于包文件夹内。包也是一种命名空间,其中的名称必须唯一。函数和类名在包中必须唯一。您可以使用包来组织类和函数。您还可以使用包在不同包中重用类和函数的名称。

注意

在 MATLAB® 7.6 版之前创建的类(即未使用 classdef 的类)不支持包。

包文件夹始终以 + 字符开头。例如,

+mypack
+mypack/pkfcn.m  % a package function
+mypack/@myClass % class folder in a package

顶层包文件夹的父文件夹必须位于 MATLAB 路径上。

列出包的内容

使用 help 命令列出包的内容:

help event
Contents of event:

EventData                      - event.EVENTDATA    Base class for event data 
PropertyEvent                  - event.PROPERTYEVENT    Event data for object property events
listener                       - event.LISTENER    Listener object
proplistener                   - event.PROPLISTENER    Listener object for property events

您也可以使用 what 命令:

what event
Classes in directory Y:xxxmatlabtoolboxmatlablang+event

EventData      PropertyEvent  listener       proplistener