在MATLAB loadobj函数中强制将struct转换为object

时间:2017-03-28 15:33:39

标签: matlab class oop object matlab-struct

我正在使用一个名为“PathObj_Standard”的自定义类。我想确保在加载此类时,如果属性CalcDate保存为单元格数组,则会将其转换为标准数组。但是,我前一段时间更改了类定义,因此当我使用loadobj函数时,我得到一个结构而不是一个对象。我正在使用的原始代码具有更多属性,因此我宁愿不通过将属性从结构分配给新对象来创建新对象。此外,我也犹豫是否要将构造函数更改为接受struct作为参数。

我尝试在loadobj中使用类函数,但我得到一个无法重新定义类'PathObj_Standard'而不调用'clear classes'错误。这个函数不应该强制将结构转换为对象吗?为什么它在loadobj函数中不起作用?

classdef PathObj_Standard < handle

properties (SetAccess = protected)
    CalcDate;      
    Name;
end
methods(Static)
    function obj=loadobj(s)
        if isstruct(s)
            obj=class(s,'PathObj_Standard');
        else
            obj=s;
        end
        if not(isempty(obj.CalcDate)) && iscell(obj.CalcDate)
            obj.CalcDate=cell2mat(obj.CalcDate);
        end
    end
end
methods
    function obj=PathObj_Standard(Name,CalcDate)
        obj.Name=Name;
        obj.CalcDate=CalcDate;
    end
end

1 个答案:

答案 0 :(得分:2)

问题在于,调用class尝试创建一个,这是您无法在loadobj内创建的。您需要调用实际构造函数

另据我的经验,从struct构建课程的最简单方法是继承hgsetget而不是handle,因为它自动拥有set和{ {1}} MATLAB图形对象的方法和这些方法可以get的形式接受属性/值。在较新版本的MATLAB中,您还可以使用SetGet mixin

struct

如果您这样做,可以将classdef PathObj_Standard < hgsetget 方法更改为

loadobj