簡體   English   中英

Matlab:將超類轉換為子類對象

[英]Matlab: Convert superclass to subclass object

我想創建一個子類, 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.

當然,我可以手動復制所有對象屬性,但是在我看來應該有更好的方法。

這是我所想到的一個例子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM