Matlab 初始化子类对象数组将创建异类超类数组
在Matlab中,我有两个类Matlab 初始化子类对象数组将创建异类超类数组,matlab,oop,Matlab,Oop,在Matlab中,我有两个类 classdef A < matlab.mixin.Heterogeneous properties a; end methods function obj = A(varargin) obj.a = 3; end end end 为什么Matlab坚持让它成为A级?我怎么能坚持它是B类的呢 编辑: 使用调试器很明显,在创建objarray(1)时,Matl
classdef A < matlab.mixin.Heterogeneous
properties
a;
end
methods
function obj = A(varargin)
obj.a = 3;
end
end
end
为什么Matlab坚持让它成为A级?我怎么能坚持它是B类的呢
编辑:
使用调试器很明显,在创建
objarray(1)
时,Matlab从未进入B
的构造函数,我自己也从未尝试过,但我相信Matlab.mixin.Heterogeneous
有一个方法getDefaultScalarElement
,您可以自己实现/重写,它将定义在指定后面的元素时如何回填数组的初始元素。有关更多信息,请参见文档页面的一半。objarray
似乎已经在您的环境中定义了……尝试执行objarray=[B,B]相反,我不知道你所说的我的环境是什么意思。。。如果你指的是工作空间/内存,那么不是,它还没有定义。当然你的建议是可行的,但是我对我建议的确切语法有特殊的需要。谢谢。我已经考虑过了,从某种意义上说,它是有效的。使用getDefaultScalarElement
,我确实可以强制A
数组中的默认对象属于B
类。然而,我不想把它锁在那个案子里。例如,如果我使用objarray(2)=C
初始化,其中C
是A
的另一个子类,那么objarray应该是类C。但是objarray必须是类A
(根类B
和C
)。我也不认为这是一个很好的解决方案。不过我们必须更进一步。您还可以将此与为类指定suberiorclasses
属性结合起来,该属性定义了一个优先层次结构,用于在连接不同类的对象时决定方法调度(在类间方法名称冲突的情况下)和类转换。也许这会有帮助?嗯,这是相关的,但我真的不想用绝对值来指定优先级。我希望构造函数的优先级由objarray(2)=A/B/C
@Patrick:在这种情况下,您唯一的选择是使用声明数组:objarray=repmat(B,2,1)
。顺便说一句,我尝试了B.empty
,但也没用。我是根据经验说,对象数组的重载subsref
和subsasgn
几乎不可能正确!您需要实现所有的下标类型:()
,
,{}
,但您肯定会破坏其中的一些类型,尤其是在使用对象数组而不是标量时(有太多可能链接下标的情况:obj(2).x{3}.y(4:6)
)。您还必须小心使用obj.x
表示法保留私有属性/方法。如果你问我这真是一团糟:)
classdef B < A
properties
b;
end
methods
function obj = B(varargin)
obj = obj@A(varargin);
obj.b = 4;
end
end
end
>> objarray(2) = B
objarray =
1x2 heterogeneous A (A, B)
Properties:
a
Methods, Superclasses