Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

包含类定义的文件夹

类定义位于路径上

要调用类方法,类定义必须位于 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。独立方法可以是扩展名为 .mlx 的实时函数。

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

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

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

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

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

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

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

调度私有文件夹中的方法

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

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

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

私有文件夹中不应出现类定义

您不能将类定义(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 将新文件夹识别为当前类定义之前清除该类。

类文件夹中的类定义

假设您在两个类文件夹 fldAfldB 中定义名为 Foo 的类的两个版本。

fldA/@Foo/Foo.m
fldB/@Foo/Foo.m

将文件夹 fldA 添加到路径的顶端。

addpath fldA

创建类 Foo 的实例。MATLAB 使用 fldA/@Foo/Foo.m 作为类定义。

a = Foo;

将当前文件夹更改为 fldB

cd fldB

当前文件夹始终是路径上的第一个文件夹。因此,MATLAB 将 fldB/@Foo/Foo.m 视为 Foo 类的定义。

b = Foo;

MATLAB 自动更新现有实例 a,以使用 fldB 中新的类定义。

路径文件夹中的类定义

假设您在两个文件夹 fldAfldB 中定义名为 Foo 的类的两个版本,但不使用类文件夹。

fldA/Foo.m
fldB/Foo.m

将文件夹 fldA 添加到路径的顶端。

addpath fldA

创建类 Foo 的实例。MATLAB 使用 fldA/Foo.m 作为类定义。

a = Foo;

将当前文件夹更改为 fldB

cd fldB

当前文件夹实际上位于路径的顶端。但是,MATLAB 没有将 fldB/Foo.m 识别为 Foo 类的定义。MATLAB 继续使用原始的类定义,直到您清除该类。

要使用 foldBFoo 的定义,请清除 Foo

clear Foo

MATLAB 自动更新现有对象,以符合 fldB 中的类定义。通常,清除实例变量是不必要的。

相关主题