【问题标题】:How can I set class properties when the values are specified as an array?当值指定为数组时,如何设置类属性?
【发布时间】:2019-03-28 15:16:48
【问题描述】:

对于我的对象构造函数,我的第一个参数是一个值数组,对应于我的类属性的长度。我想遍历该输入数组并使用数组中的相应值初始化每个属性。

function obj = Waveform(required, options, varargin)
            objProperties = reshape(properties(obj), [1, size(properties(obj))]);

            for index = 1:size(required, 2)
                set(obj, objProperties(:, index), required(:, index));
            end
end

我知道循环可以工作,但我不知道如何或是否可以以上述方式初始化。

在当前状态下,程序返回以下错误:Cannot find 'set' method for Waveform class。

【问题讨论】:

  • 你试过运行这个吗?它是否有效,还是会出错?
  • 这确实返回一个错误:它说 matlab 找不到“波形类的设置方法”。
  • 如果你从a class that implements them派生/继承,你的类默认只有set/get方法。否则,您必须自己实现它们。
  • 据我了解,只有在涉及自定义功能时才需要重载 set/get —— 我只是在尝试自动初始化每个属性,其功能类似于 obj.Property1 = Value1;
  • 这似乎是一种非常古怪的设置属性的方法。您不知道属性的顺序,特别是如果您想使用该类而无需阅读源代码,或者如果该类被修改?为什么名称-值对(一种在 MATLAB 中输入可选参数的成熟方法)不受欢迎?

标签: arrays matlab properties iteration


【解决方案1】:

如果您的类没有实现set 方法,则不能使用set(obj, ...) 来实现此目的。如果您的类从a built-in class that implements them 派生/继承,则默认情况下您将只有set/get 方法。

如果您不想从这些类之一继承或自己实现set/get 方法,您可以使用dynamic field referencing 来实现这一点。这是一个示例类:

classdef Waveform

  properties
    a
    b
    c
  end

  methods
    function obj = Waveform(required)
      objProperties = properties(obj);
      for index = 1:numel(required)
        obj.(objProperties{index}) = required(index);
      end
    end
  end

end

您可以按如下方式创建新对象:

>> obj = Waveform([1 2 3])

obj = 

  Waveform with properties:

    a: 1
    b: 2
    c: 3

>> obj = Waveform([1 2])  % Only pass 2 values...

obj = 

  Waveform with properties:

    a: 1
    b: 2
    c: []  % ...and the third property is not initialized

但是,这似乎是一种非常脆弱的方法,如果您通过添加或删除属性来修改您的类,那么它很难维护并且很容易破坏。我建议将属性值作为单独的参数传递给您的constructor,或者可能使用input validation methods

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-04
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2012-03-10
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多