Matlab - Can Handle类构造函数使用varargin来分配属性吗?

时间:2014-10-30 01:59:28

标签: matlab constructor handle

我需要一些帮助才能使用varargin在句柄类中分配属性。

如果我使用varargin创建一个函数,而不是使用handle类,它可以工作。

function out = testFunction(varargin)

% default values
startDate = '2011-11-01';
endDate = datestr(now,'yyyy-mm-dd');

% Map of parameter names to variable names
params_to_variables = containers.Map({'StartDate','EndDate'}, {'startDate','endDate'});

v = 1;
while v <= numel(varargin)
    param_name = varargin{v};
    if isKey(params_to_variables,param_name)
        assert(v+1<=numel(varargin));
        v = v+1;
        % Trick: use feval on anonymous function to use assignin to this workspace
        feval(@()assignin('caller',params_to_variables(param_name),varargin{v}));
    else
        error('Unsupported parameter: %s',varargin{v});
    end
    v=v+1;
end
end

但我目前的任务是创建一个包含许多属性的超类。有各种类型的子类。不同的子类可能需要使用不同的属性。所以当我创建一个超类或子类的实例时,我需要输入非常灵活。如上例所示,一个子类只需要属性'startDate',而另一个子类只需要属性'endDate'。这是我的代码。

classdef superclass < handle
    properties 
        startDate
        endDate
    end

    methods
        function obj = superclass(varargin)
            % Map of parameter names to variable names
            params_to_variables = containers.Map({'StartDate','EndDate'}, {'startDate','endDate'});

            v = 1;
            while v <= numel(varargin)
                 param_name = varargin{v};
                 if isKey(params_to_variables,param_name)
                    assert(v+1<=numel(varargin));
                    v = v+1;
                             feval(@()assignin('caller',params_to_variables(param_name),varargin{v}));
                 else
                    error('Unsupported parameter: %s',varargin{v});
                 end
                 v=v+1;
             end
        end
    end
end

基本上我只是复制粘贴,它不起作用。 所以我改变了

  feval(@()assignin('caller',params_to_variables(param_name),varargin{v}));

feval(@()assignin('caller',strcat('obj.',params_to_variables(param_name),varargin{v}));

feval(@()assignin('base',strcat('obj.',params_to_variables(param_name),varargin{v}));

evalin('caller',...
strcat('obj.',params_to_variables(param_name),'=',num2str(varargin{v})));

evalin('base',...
strcat('obj.',params_to_variables(param_name),'=',num2str(varargin{v})));

它们都不起作用。如果有人能告诉我如何解决这个问题或者为我提供另一种方式,我很感激。谢谢。

0 个答案:

没有答案