Как я могу установить свойства класса, когда значения указаны в виде массива? - PullRequest
1 голос
/ 28 марта 2019

Для моего конструктора объекта мой первый аргумент - это массив значений, который соответствует длине свойств моего класса. Я хочу перебрать этот входной массив и инициализировать каждое свойство соответствующим значением в массиве.

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

Я знаю, что цикл работает, но я не знаю, как или возможно ли выполнить инициализацию вышеуказанным способом.

В своем текущем состоянии программа возвращает следующую ошибку: Не удается найти метод set для класса Waveform.

1 Ответ

1 голос
/ 28 марта 2019

Если в вашем классе не реализован метод set, вы не можете использовать set(obj, ...) для достижения этой цели. По умолчанию у вас будут методы set/get, только если ваш класс наследует / наследует от встроенный класс, который их реализует .

Если вы не хотите наследовать от одного из этих классов или реализовать методы set/get самостоятельно, вы можете использовать динамическое поле со ссылкой для достижения этой цели. Вот пример класса:

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

Однако , это выглядит как очень хрупкий подход, который будет трудно поддерживать и может легко сломаться, если вы когда-нибудь измените свой класс, добавив или удалив свойства. Я бы предложил передать значения свойств в ваш конструктор в качестве отдельных аргументов или, возможно, использовать методы проверки ввода .

...