我多次遇到过这个问题,我希望最终解决这个问题。
在MATLAB中创建异构类层次结构时,有一个名为getDefaultScalarElement
的受保护静态方法,它允许您定义用于创建数组的默认标量对象。如果层次结构的元素是抽象的,则可以覆盖该方法以使用其他类。
例如
classdef (Abstract) AbstractRoot < matlab.mixin.Heterogeneous
methods (Static, Access = protected)
function DefaultObj = getDefaultScalarElement()
DefaultObj = ConcreteSubclass1();
end
end
end
classdef ConcreteSubclass1 < AbstractRoot
end
classdef ConcreteSubclass2 < AbstractRoot
end
matlab中的每个具体类都有一个名为empty
的公共静态隐藏方法,它创建一个该对象的空数组。我想为抽象类创建一个空方法,它的功能与getDefaultScalarObject
方法类似。这将允许我调用AbstractRoot.empty()
并接收默认类型的空数组。
例如:
classdef (Abstract) AbstractRoot < matlab.mixin.Heterogeneous
methods (Static, Hidden)
function EmptyObj = empty()
EmptyObj = ConcreteSubclass1.empty();
end
end
methods (Static, Access = protected)
function DefaultObj = getDefaultScalarElement()
DefaultObj = ConcreteSubclass1();
end
end
end
不幸的是,这不起作用(无限递归)。我遇到的主要问题是我不知道如何覆盖empty
,并且仍然能够从子类调用它的内置版本,因为empty
不是从任何地方继承的<{1}} / p>
答案 0 :(得分:1)
迟到总比不上......
据我所知,它完全没有记录:(只能验证2013a)
有了这个,我们可以为任何类重新创建一个等效的内置版本的空。
然后可以使用它来覆盖内置版本。因此,它可以单独为子类定义,这将阻止调用定义的超类方法(并避免递归)。
所以使用3个classdef m文件
首先是问题中的第二个AbstractRoot定义;
然后两个子类具有如下定义的empty
方法(创建Obj
变量作为必需的类)
classdef ConcreteSubclass1 < AbstractRoot
methods (Static, Hidden)
function EmptyObj = empty( varargin )
if isempty( varargin )
ind = double.empty; %// as calling double.empty([]) errors
else
ind = double.empty( [varargin{:}] );
end
Obj = ConcreteSubclass1(); %// or Obj = ConcreteSubclass2();
EmptyObj = Obj(ind);
end
end
end
我们现在可以调用所有3个class.empty方法
a = AbstractRoot.empty
b = ConcreteSubclass2.empty
c = ConcreteSubclass1.empty
a =
0x0 ConcreteSubclass1 array with no properties.
b =
0x0 ConcreteSubclass2 array with no properties.
c =
0x0 ConcreteSubclass1 array with no properties.
最后,如果从AbstractRoot的子类中省略empty
定义,则将调用抽象根的重载版本,从而生成ConcreteSubclass1数组
d = ConcreteSubclass3.empty
d =
0x0 ConcreteSubclass1 array with no properties.