【问题标题】:Dynamically add a field to an object in matlab在matlab中为对象动态添加字段
【发布时间】:2013-01-10 22:37:37
【问题描述】:

假设我在类文件中定义了一个 MATLAB 对象

classdef foo

   properties
      bar
   end

end

然后我创建了一个 foo 对象

myfoo = foo();

现在我想动态地向 foo 添加另一个字段。我想要的是

myfoo.newfield = 42;

但这会引发错误。

我知道有一种方法可以将字段/属性动态添加到 MATLAB 对象,但我不记得它或在帮助中很容易找到它。有人知道语法吗?

【问题讨论】:

  • 我所做的是将结构添加为对象的属性,然后将字段添加到结构中。但对我来说,这有点不直观,因为我希望能够添加新属性。

标签: matlab oop


【解决方案1】:

好的,找到了。但它不是通用的,只有 dynamicprops 类的子类实现它。 这是我记得遇到的。所以我怀疑这个问题的一般答案是你做不到。

任何作为dynamicprops 类的子类(它本身是handle 类的子类)的类都可以使用addprop 方法定义动态属性。语法是:

P = addprop(H,'PropertyName')

【讨论】:

  • 在我看来,这种行为是非常可取的行为。如果可以任意向任何类添加属性,则可能会失去很多健壮性。如果你有一个现有的类,你想在不修改它的情况下创建一个 dynamicprops 类,你可以将 foo 和 dynamicprops 子类化:classdef dynamicfoo < foo & dynamicprops 还有什么可以“阻止你这样做”?
  • 我不认为有很多健壮性开始。属性的数量和名称的限制并不像 matlab 没有的强类型那么重要。动态添加字段会失去什么——这不会破坏任何不知道该字段的现有代码。但是,如果“square”应该是“Shape”,您可以说 obj.square = 3 并破坏依赖“square”作为“Shape”的现有代码。这样做的原因是更改已经在内存中的类,而不必清除并重新加载该类的所有实例。
  • 在 6 月 11 日的评论中,您问“动态添加字段会失去什么[?]”一件事是错误检查 - 通常,如果您有一个 Circle 对象,您真的 不想指定一个(哦,比方说)“温度”。如果您编写这样的代码... x = Circle(); ...大量代码、函数调用等... x.temperature = 98.6;很有可能你在某个地方犯了错误。所以,查看 DYNAMICPROPS 类的一种方法是说,“嘿,以后不要费心检查这个对象。如果我分配给一个不好的‘属性’,相信我,我知道我在做什么。 "是否要这样做由您决定。
  • 另一个简单的例子:假设你有 x = Circle();其中 circle 具有默认值为 1 的 radius 属性。然后您编写 x.Radius = 3(而不是 x.radius = 3)并想知道为什么 x.computeCircumference 返回 3.1415 而不是 18.8496。
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多