【问题标题】:Matlab: Convert superclass to subclass objectMatlab:将超类转换为子类对象
【发布时间】:2012-07-22 19:54:44
【问题描述】:

我想为内置的ss 类创建一个子类ess。我希望能够将现有的 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 实例
  • 我不确定该评论是否对我有帮助。我该怎么做?让我尝试更清楚一点:我希望能够采用现有的 ss 实例并添加其他信息(例如 w 的值)。如果不手动复制原始对象中的所有值,这可能吗?

标签: oop matlab inheritance casting


【解决方案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)

我明白了:

xx = 
  ess handle

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

【讨论】:

  • 如果你想让上面的函数getProps更通用,你可以使用反射来提取对象属性而不用硬编码它们的名字。类似于:m = metaclass(ssObj); 然后循环遍历属性以提取值 ssObj.(m.PropertyList(i).Name)
  • 好的,这就是我所说的“手动复制属性”的意思。我想这就是要走的路。感谢您的帮助!
  • 太好了,感谢您提供额外的指针。我猜应该是x.(m.Properties{i}.Name),对吧?
  • @sebhofer:这里是another example,它实现了类似复制构造函数的行为。你也应该看看matlab.mixin.Copyable,虽然我以前没用过……
猜你喜欢
  • 2013-09-03
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2021-01-23
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多