Matlab中包含类定义的文件夹

目录

包含类定义的文件夹

类定义位于路径上

类和路径文件夹

使用路径文件夹

使用类文件夹

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

类优先级和 MATLAB 路径

更改路径以更新类定义


包含类定义的文件夹

类定义位于路径上

        要调用类方法,类定义必须位于 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 路径上。将类定义文件放在类文件夹中,该文件夹也可以包含单独的方法文件。类定义文件必须与类文件夹同名(除 @ 字符外)。类定义(以 classdef 关键字开头)必须出现在文件中的任何其他代码之前(空白和注释不构成代码)。

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

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

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

        类文件的优势在于,MATLAB 可以将文件夹中的任何文件显式标识为该类的方法。具体可以参考更改路径以更新类定义

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

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

        私有文件夹中的函数只能从 private 文件夹紧邻的父级文件夹中定义的函数访问。在类文件夹内的 private 文件夹中定义的任何函数都将成为具有 private 访问权限的类方法。

        如果类文件夹包含 private 文件夹,则只有类文件夹中定义的类才能访问 private 文件夹中定义的函数。子类无法访问超类私有函数。可以参考私有函数

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

调度私有文件夹中的方法

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

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

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

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

        不能将类定义(classdef 文件)放入私有文件夹中,因为这样做不符合类或路径文件夹的要求。

类优先级和 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/Foo.m 位于 fldr3/@Foo 之前

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

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

  • fldr2/Foo.m 不是类

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

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

  • 在路径上,fldr2/Foo.m 位于 fldr5/Foo.m 类之前

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

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

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

  • 方法 bar 不被识别为 fldr3/@Foo 中定义的 Foo 类的一部分。

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

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

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

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

更改路径以更新类定义

        更改 MATLAB 路径可以更改某个类的类定义文件(参考path)。但是,对于在路径文件夹中定义的类(即,不在类 @ 文件夹中),必须在 MATLAB 将新文件夹识别为当前类定义之前清除该类。

类文件夹中的类定义

        假设在两个文件夹 fldA 和 fldB 中定义名为 Foo 的类的两个版本。

fldA/+FooPkg/@Foo/Foo.m
fldB/+FooPkg/@Foo/Foo.m

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

addpath fldA

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

a = FooPkg.Foo;

        将当前文件夹更改为 fldB。

cd fldB

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

b = FooPkg.Foo;

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

路径文件夹中的类定义

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

fldA/+FooPkg/Foo.m
fldB/+FooPkg/Foo.m

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

addpath fldA

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

a = FooPkg.Foo;

        将当前文件夹更改为 fldB。

cd fldB

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

clear FooPkg.Foo

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值