主要内容

包含类定义的文件夹

您可以使用不同类型的文件夹来定义和组织 MATLAB® 中的类。

  • 路径文件夹 - 这种类型的文件夹位于 MATLAB 路径中,并且文件夹名称不以 +@ 字符开头。当您要在一个文件夹中包含多个类和函数时,请使用这种类型的文件夹。在路径文件夹中,每个类定义必须包含在一个文件中。

  • 类文件夹 - 文件夹名称以 @ 字符开头,后跟类名称。此类型的文件夹不在 MATLAB 路径上,但其父文件夹在该路径上。当您要使用多个文件定义一个类时,请使用此类型的文件夹。

  • 命名空间文件夹 - 文件夹名称以 + 字符开头,后跟类名称。命名空间是特殊的文件夹,可以包含类文件夹、类定义文件、函数文件和其他命名空间(称为内部命名空间)。由于文件夹名称成为类名称的一部分,因此命名空间为其中包含的项创建更稳健的名称。

本主题讲述路径和类文件夹的使用。有关命名空间的详细信息,请参阅创建命名空间

使用路径文件夹

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

每个类定义文件的名称必须与用 classdef 关键字指定的类的名称相匹配。您可以在同一路径文件夹中定义多个类,但每个类定义(包括所有方法)都必须包含在一个文件中。

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

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

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

addpath path_folder

使用类文件夹

类文件夹的名称始终以 @ 字符开头,后跟该文件夹包含的类名称。类文件夹必须包含在路径文件夹中。将类定义文件放在类文件夹中,该文件夹也可以包含单独的方法文件。例如,MyClass 及其两个方法在 @MyClass 文件夹中定义。

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

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

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

类文件夹内的私有文件夹中的函数

私有文件夹中的函数只能从 private 文件夹紧邻的父级文件夹中定义的函数访问。在类文件夹中的 private 文件夹中定义的任何函数只能从类的方法中调用。函数可以访问类的私有成员,但它们本身不是方法。它们不要求将对象作为输入传递,且只能使用函数表示法来调用。当您需要可通过类的多个方法调用的辅助函数时,请使用 private 文件夹中的函数。

如果类文件夹包含 private 文件夹,则只有类文件夹中定义的类才能访问 private 文件夹中定义的函数。子类无法访问超类私有函数。有关私有文件夹的详细信息,请参阅私有函数

如果您需要子类能够访问超类的私有函数,请将这些函数定义为超类的受保护方法。指定这些方法时,将 Access 属性设置为 protected

调度私有文件夹中的方法

如果类在类文件夹的 private 文件夹中定义了函数,则 MATLAB 在决定调度私有函数还是 classdef 文件的方法时,将遵循以下优先级规则:

  • 使用圆点表示法 (obj.methodName) 时,在 classdef 文件中定义的方法优先于在 private 文件夹中的同名函数。

  • 使用函数表示法 (methodName(obj)) 时,private 文件夹中的函数优先于 classdef 文件中定义的同名方法。

注意

不能将类定义放在私有文件夹中。

类优先级和 MATLAB 路径

存在多个同名的类定义时,MATLAB 路径上的文件位置决定优先级。文件夹中位于 MATLAB 路径前面的类定义优先于该路径中后面的任何类。

如果函数位于路径中较早出现的文件夹中,则与路径文件夹中的类同名的函数优先于该类。但是,在类文件夹(@ 文件夹)中定义的类优先于同名的函数,即使该函数是在路径中较早出现的文件夹中定义的也是如此。

例如,此路径包含同名的函数和类。尽管 fldr1 中的函数 Foo 位于路径的前面,但 fldr2 中的类 Foo 优先,因为它是在类文件夹中定义的。

在路径上的顺序文件夹和文件文件定义的内容

1

fldr1/Foo.m

函数 Foo

2

fldr2/@Foo/Foo.m

Foo

在以后的版本中,@ 文件夹中的类将不再优先于同名函数

在以后的版本中,类文件夹(@文件夹)中定义的类将不再优先于同名函数,而不管它在路径上的位置如何。从 R2024a 开始,MATLAB 在满足以下三个条件时会发出警告:

  • 您在路径中的类文件夹中定义了同名的类和函数。

  • 函数在路径中的顺序早于类。

  • 您使用函数和类的名称。

要确保类在规则更改后仍具有优先级并避免警告,请使用以下选项之一:

  • 更新路径配置,将类置于路径中比函数更早的位置。有关使用路径的详细信息,请参阅什么是 MATLAB 搜索路径?

  • 从路径中删除函数。

  • 重命名函数。

要永久赋予函数优先级并避免警告,请使用以下选项之一:

  • 从路径中删除类。

  • 重命名类。

更改路径以更新类定义

MATLAB 只能将类的一个定义识别为当前定义。更改您的 MATLAB 路径可以更改某个类的定义文件(请参阅 path)。MATLAB 遵循以下规则以用于在更改路径后更新类定义:

  • 当从路径中删除类定义时,MATLAB 会清空该类定义,除非工作区中存在该类的现有实例。

  • 当新类定义添加到路径中并且它优先于同名的旧定义时,MATLAB 使用新定义。MATLAB 会在系统下次访问该类的现有实例时更新这些实例。

  • 如果您在脚本或函数执行期间更改路径,并且在更改过程中更新了某个类,则在脚本或函数执行完毕之前,MATLAB 不会更新或清除任何类定义。

注意

更改当前文件夹也是路径更改,并且当前文件夹中的类定义始终优先于路径中的定义。

在 R2024b 之前的版本中: 包含类定义的文件夹的类型会影响 MATLAB 在路径更改后更新类定义的方式。当新定义位于类文件夹(@ 文件夹)中时,MATLAB 会立即更新类定义,但对于在路径文件夹中定义的类,您必须在 MATLAB 识别新定义之前清除旧定义。

另请参阅

主题