Matlab @folder 类属性混淆

Posted

技术标签:

【中文标题】Matlab @folder 类属性混淆【英文标题】:Matlab @folder class property confusion 【发布时间】:2012-08-22 21:12:50 【问题描述】:

我在 matlab 中使用预先存在的代码,这些代码被组织成类。它不使用classdef,而是使用@folder's。我不完全确定它是如何工作的以及它给我带来了一些麻烦。

构造函数格式如下:

function this = crazy_class(varargin)

    this.a = [];
    this.b = [];
    this = class(this, 'crazy_class'); 

end

我需要在类中添加一个新属性,但如果我这样修改它:

function this = crazy_class(varargin)

    this.a = [];
    this.b = [];
    this.newProperty = [];
    this = class(this, 'crazy_class'); 

end

我得到以下信息:

Number of fields for class crazy_class cannot be changed without clear classes.

我不喜欢在类中添加新的未指定属性。很公平,如果有一个 classdef,添加一个新属性会很简单,但是我不知道如何使用 @folder 格式来做到这一点。

文件夹中没有 .m 文件或任何与此相关的文件来指定类的任何属性。我能找到的最接近的是重载函数:

subsasgn.m:

  this = builtin('subsasgn', this, selector, value);

subsref.m:

 r = builtin('subsref', this, selector);

但就是这样。当任何其他文件中没有提到它们时,此类如何知道哪些是有效属性,哪些不是。我应该寻找什么来改变这一点?

编辑:这很尴尬...我重新启动了 Matlab,现在一切正常。我认为通过键入命令 clear classes 或 clear all 可以解决问题,但我想它需要完全重启。

【问题讨论】:

【参考方案1】:

关键是,您现在必须执行命令“清除类”,因为存在旧格式的类成员。 MATLAB 自己告诉了你这个事实。这些属性在 crazy_class.m 文件中定义。

【讨论】:

【参考方案2】:

您在这里使用的是“旧式”面向对象的代码。 MATLAB 7.6 引入了“新式”面向对象的语法(使用 classdef 等),但在此之前,您可以使用您在此处使用的样式,它仍然受支持但已过时。

我建议您查看过时的文档,该文档仍然可用here。它将解释语法的细节,以及如何使用这些类。

【讨论】:

以上是关于Matlab @folder 类属性混淆的主要内容,如果未能解决你的问题,请参考以下文章

Matlab类动态填充一个属性

访问 Matlab 类属性(又名常量)

在 Matlab 中将结构属性的字段作为类的属性

在matlab的B类属性中使用A类的对象?

类属性的 C++ 等价于 Matlab Abstract

Matlab 类:不一致的状态和“PostSet”属性监听器