Matlab:将超类转换为子类对象

3

我希望创建一个名为ess的子类,继承内置的ss类。我想要将现有的ss对象转换为ess对象,并在此同时添加缺失的属性,例如w,通过以下方式实现:

sys=ss(a,b,c,d);
esys=ess(sys,w);

但我无法弄清如何正确设置构造函数。最好的方法是什么?我的代码目前看起来像这样

classdef ess < ss
    properties
        w
    end
    methods
        function obj = ess(varargin)
            if nargin>0 && isa(varargin{1},'StateSpaceModel')
                super_args{1} = sys;
            else
                super_args = varargin;
            end
            obj = obj@ss(super_args{:});
        end
    end 
end

但是这样做不起作用,我收到了以下错误信息:
 >> ess(ss(a,b,c,d))
 ??? When constructing an instance of class 'ess', the constructor must preserve
 the class of the returned object.

当然,我可以手动复制所有对象属性,但我认为应该有更好的方法。


不要在构造函数中编写该代码,而是编写一个帮助函数,该函数接受一个 ss 实例并从中返回一个新的 ess 实例。 - Amro
我不确定那个评论对我有帮助。我该怎么做呢?让我尝试更清晰地表达:我想能够获取现有的 ss 实例并添加额外的信息(例如 w 的值)。是否可以在不手动复制原始对象的所有值的情况下实现? - sebhofer
1个回答

1

这是我心中所想的一个例子:

classdef ss < handle
    properties
        a
        b
    end

    methods
        function obj = ss(varargin)
            args = {0 0};     %# default values
            if nargin > 0, args = varargin; end
            obj.a = args{1};
            obj.b = args{2};
        end
    end
end

并且:

classdef ess < ss
    properties
        c
    end

    methods
        function obj = ess(c, varargin)
            args = {};
            if nargin>1 && isa(varargin{1}, 'ss')
                args = getProps(varargin{1});
            end
            obj@ss(args{:});    %# call base-class constructor
            obj.c = c;
        end     
    end
end

%# private function that extracts object properties
function props = getProps(ssObj)
    props{1} = ssObj.a;
    props{2} = ssObj.b;
end

让我们测试这些类:

x = ss(1,2);
xx = ess(3,x)

I get:

xx = 
  ess handle

  Properties:
    c: 3
    a: 1
    b: 2
  Methods, Events, Superclasses

如果你想让上面的 getProps 函数更加通用,你可以使用反射来提取对象属性而不是硬编码它们的名称。类似这样:m = metaclass(ssObj) 然后循环遍历属性以提取值 ssObj.(m.PropertyList(i).Name) - Amro
好的,我所说的“手动复制属性”就是这个意思。我想那应该是正确的做法。谢谢你的帮助! - sebhofer
太好了,感谢您提供的额外指针。我猜应该是 x.(m.Properties{i}.Name),对吗? - sebhofer
@sebhofer: 这里有另一个实现类似于复制构造函数的例子。你还应该了解一下 matlab.mixin.Copyable,虽然我以前没有使用过它... - Amro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接