主要内容

已修改类的自动更新

MATLAB负载类定义

MATLAB®加载类定义:

  • 类第一次被引用,例如创建实例、访问常量属性或调用类的静态方法。

  • 每当加载类的定义发生变化,MATLAB返回到命令提示符时。

  • 当您更改MATLAB路径并导致使用不同的类定义时。修改在MATLAB返回命令提示符后生效。

  • 当您访问类元数据时。

MATLAB只允许一个类在任何时候存在一个定义。因此,MATLAB尝试自动更新类的所有现有对象,以符合新的类定义。你不需要打电话明确的类在更改现有对象的定义类时删除它们。

请注意

使用MATLAB编辑器以外的编辑器或使用MATLAB在线™可能导致自动更新延迟。

自动更新的后果

MATLAB在更新现有对象时遵循一组基本规则。自动更新会导致:

  • 将现有对象更新为新的类定义。

  • 如果MATLAB不能将对象转换为新的类定义,或者类定义本身存在错误,则为错误。

下面是创建具体类实例时会发生什么情况的示例,编辑类定义以使类抽象。

a = MyClass;编辑MyClass使其抽象一个
无法更新对象,因为'MyClass'现在是抽象类。

请注意

当您更改类的定义时,MATLAB不会更新元类实例。更新类定义后,必须获得新的元类数据。

当类定义改变时会发生什么

当类定义发生变化时,MATLAB会更新现有对象,包括以下情况:

  • 值更改为句柄——现有对象成为引用不同对象的独立句柄。

  • 添加枚举成员——现有对象保留它们以前拥有的枚举成员,即使底层值已经更改。

  • 枚举成员已移除——未使用已移除成员的现有对象具有与先前相同的枚举成员。使用已移除成员的现有对象将已移除成员替换为枚举的默认成员。

  • 枚举块被移除——枚举成员不再使用。

  • 超类定义更改-应用于该超类层次结构中的所有子类的更改。

  • 添加或删除超类-应用于所有现有对象的超类的更改。

确保定义文件夹仍然在范围内

对MATLAB路径的更改会导致从路径中删除类定义文件,即使是临时的,也会产生副作用。如果函数从包含类定义的当前文件夹更改,并且该文件夹不在路径上,则该函数不能调用现在超出作用域的类的方法。为了避免潜在的问题,请在更改到另一个文件夹之前将类定义文件夹添加到路径中。

例如,假设输入的类obj在当前文件夹中定义,该文件夹不在路径上。方法将当前文件夹添加到路径中,然后再将当前文件夹更改为其他文件夹目录函数。

函数runFromTempFolder (obj)将当前文件夹添加到路径addpath(pwd)定义文件夹= cd(“myTempFolder”);obj.myMethod;cd (definingFolder)结束

不触发更新的操作

这些操作不会更新现有对象:

  • 调用函数在过期对象上执行

  • 将过期对象赋值给变量

  • 调用不访问类数据的方法

  • 更改类定义中的属性验证(验证属性值

直到以公开更改的方式引用对象,例如调用对象显示或赋值给属性,对象才会更新。

对类定义的多次更新

更新不会以增量方式进行。更新符合类的最新版本。

删除类文件的对象有效性

删除类定义文件不会使该类的实例无效。但是,不能对该类的现有对象调用方法。

当更新不可能时

某些类更新会导致无效的类定义。在这些情况下,直到错误被解决,对象才会更新:

  • 添加超类可能导致属性或方法被定义两次。

  • 将超类更改为密封当其中一个子类的对象存在时,将导致无效的子类定义。

有些类更新会导致MATLAB无法更新现有对象以符合修改后的类定义的情况。这些情况会导致错误,直到你删除对象:

  • 向非枚举类添加枚举块

  • 将类重新定义为抽象类

  • 从异构层次结构中删除类将导致没有默认对象来替换异构数组中的现有对象

  • 更新类以限制数组形成行为,例如重载数组索引和连接。

  • 继承一个subsrefsubsasgnvertcat,或horzcat方法

  • 将句柄类重新定义为值类。

类更新的潜在后果

  • 更新之后,现有的对象可能与新的类定义不兼容。例如,新添加的属性可能要求构造函数的执行有效。

  • 删除或重命名属性可能会丢失属性中保存的数据。例如,如果一个属性拥有对另一个对象的唯一引用,并且您从类中删除了该属性,MATLAB将删除该对象,因为不再有对它的任何引用。

  • 从异构类层次结构中删除类可能导致无效的异构数组元素。在这种情况下,异构层次结构的默认对象将替换这些数组元素。

与调试器的交互

因为R2021a。

MATLAB在类更新期间禁用调试器。在R2021a之前,断点可能会中断类更新过程,并允许在更新恢复时引入错误。例如,断点允许类作者在类定义中引入无效的语法,或者从路径中完全删除类,这可能会导致MATLAB崩溃。

禁用断点的示例

这个类定义了一个属性验证函数:

classdefClassWithBreakpoint属性(恒)Prop1(1,1) {myPropertyValidator}= 32结束结束函数myPropertyValidator (~)结束此处添加断点
创建该类的一个实例。的定义,然后在指定的位置添加断点Prop1到不同的初始值:
Prop1 (1,1) {myPropertyValidator} = 10
在R2020b及更早的版本中,MATLAB遇到断点,类更新被中断。在R2021a中,调试器被禁用,断点不会中断更新。

类属性更新

改变类属性可以改变现有的对象行为或使对象无效。当您访问无效对象时,MATLAB返回一个错误。

改变 效果

使摘要= true

访问现有对象将返回一个错误。

改变AllowedSubclasses

新创建的对象可以继承不同于现有对象的超类。

改变ConstructOnLoad

的当前值ConstructOnLoad

改变HandleCompatible

新创建的对象可以具有与现有对象不同的类层次结构。

改变隐藏的

类在超类列表中的外观和访问帮助函数可以改变

改变InferiorClasses

现有对象的方法调度可以更改。

使密封=真

现有子类对象在访问时返回错误。

更新属性定义

当您更改类属性的定义时,MATLAB将更改应用于类的现有对象。

改变 效果

添加属性

将新属性添加到类的现有对象中。将属性值设置为默认值(即[]如果类定义没有指定默认值)。

删除属性

从类的现有对象中移除属性。访问已删除属性的尝试失败。

更改属性默认值

不对类的现有对象应用新的默认值。

在子类和超类之间移动属性

当属性定义在父类和子类之间移动时,不应用不同的默认值。

更改属性属性值

将更改应用到类的现有对象。

有些情况需要采取过渡步骤:

  • 摘要—变成抽象类的现有对象不能更新。删除这些对象。

  • 访问-更改公共受保护的,或私人属性访问设置影响对现有对象的访问。

    对访问列表的更改不会更改现有对象。但是,如果将类添加到访问列表中,则这些类的实例可以访问此属性。如果从访问列表中删除类,这些类的对象将不再具有此属性的访问权。

  • 依赖-如果更改为真正的,现有对象不再存储属性值。如果要查询属性值,请为该属性添加属性get方法。

  • 瞬态-如果更改为真正的,对象已经保存,重新加载此属性值。如果更改为,已保存的对象使用默认值重新加载此属性。

方法定义更新

当您更改类方法的定义时,MATLAB将更改现有对象中受影响的类成员,如下所示。

改变 效果

添加方法

您可以在类的现有对象上调用新方法。

修改方法

修改可用于现有对象。

删除方法

您可以在现有对象上调用已删除方法。

更改方法属性值

对类的现有对象应用更改。

有些情况需要采取过渡步骤:

  • 摘要—变成抽象类的现有对象不能更新。删除这些对象。

  • 访问-方法的改变公共受保护的,或私人访问设置影响对现有对象的访问。

    对访问列表的更改不会更改现有实例。但是,如果将类添加到访问列表中,这些类的实例就可以访问此方法。如果从访问列表中删除类,这些类的对象将不再具有此方法的访问权。

  • 密封-如果更改为真正的并且现有的子类已经定义了该方法,MATLAB返回一个错误,因为新的类定义不能应用于现有的子类。

事件定义更新

改变 效果

添加事件

类的现有对象支持新事件。金宝app

更改事件名称

新的事件名称对类的现有对象可见。MATLAB:

  • 不更新现有元类对象

  • 是否更新新获取的元类对象

  • 没有更新监听器以使用新的事件名称

删除事件

现有对象不再支持已删除事件。金宝app

更改事件属性值

对类的现有对象应用更改。

有些情况需要采取过渡步骤:

  • ListenAccess-事件的更改公共受保护的,或私人监听访问设置会影响对现有对象的访问。

    对访问列表的更改不会更改现有对象。但是,如果将类添加到访问列表中,这些类的对象可以为此事件创建侦听器。如果从访问列表中删除类,则不允许这些类的对象为此事件创建侦听器。

  • NotifyAccess-事件的更改公共受保护的,或私人通知访问设置影响对现有对象的访问。

    对访问列表的更改不会更改现有对象。但是,如果将类添加到访问列表中,这些类的实例可以触发此事件。如果删除类,这些类的对象将无法触发此事件。

相关的话题