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。对于 MATLAB 版本 R2018a 及更高版本,独立方法可以是扩展名为 .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 路径前面的类定义始终优先于该路径中后面的任何类,无论这些定义是否包含在类文件夹中。

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

例如,假设有包含以下文件夹和文件的路径。

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

1

fldr1/Foo.m

Foo

2

fldr2/Foo.m

函数 Foo

3

fldr3/@Foo/Foo.m

Foo

4

fldr4/@Foo/bar.m

方法 bar

5

fldr5/Foo.m

Foo

MATLAB 应用以下逻辑来确定调用哪个版本的 Foo

fldr1/Foo.m 优先于类 fldr3/@Foo,因为:

  • 在路径中,fldr1 位于 fldr3 之前,且 fldr1/Foo.m 是类。

fldr3/@Foo 优先于 fldr2/Foo.m 函数,因为:

  • fldr3/@Foo 是类文件夹中的类。

  • fldr2/Foo.m 不是类。

  • 类文件夹中的类优先于函数。

函数 fldr2/Foo.m 优先于类 fldr5/Foo.m,因为:

  • 在路径中,fldr2 位于 fldr5 类之前。

  • fldr5/Foo.m 不在类文件夹中。

  • 未在类文件夹中定义的类遵循关于函数的路径顺序。

fldr3/@Foo 优先于 fldr4/@Foo,因为:

  • 在路径中,fldr3 位于 fldr4 之前。

如果 fldr3/@Foo/Foo.m 包含在 7.6 版之前创建的 MATLAB 类(即,该类不使用 classdef 关键字),则 fldr4/@Foo/bar.m 成为在 fldr3/@Foo 中定义的 Foo 类的方法。

早期版本中在类文件夹中定义的类的行为

在 MATLAB 版本 5 至 7 中,类文件夹不会遮蔽那些与之同名、但路径顺序靠后的文件夹中的类文件夹。该类将结合使用所有同名类文件夹中的方法来定义该类。此行为不再受到支持。

为了向后兼容,类文件夹中定义的类始终优先于同名的函数和脚本。此优先级也适用于路径上先于这些类出现的函数和脚本。

更改路径以更新类定义

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 中的类定义。通常,清除实例变量是不必要的。

相关主题