如何将不同类的对象存储在一个数组中,并在MATLAB中调用相同的函数(定义不同)



我有两个子类:

  • 线路
  • 弧形

它们的对象将通过在末端附加它们来创建路径。这些都有自己的";plotCurve";方法。我想将这些对象按如下顺序存储在数组中:

path = [line1,line2,arc1,line3,arc2,arc3,line4,arc4,arc5...];

(我认为"路径"应该是超类"路径"的对象。(当我编写类似的代码时;

for i=1:size(path)
path(i).plotCurve;
hold on
end

应该显示结果。我应该能看到整条路。(因此,当"Line"的对象出现时,应该运行"plotCurve"方法,对于Arc对象也是如此(。

看起来matlab.mixin.Heterogeneous的子类化允许这种行为:

classdef Path < matlab.mixin.Heterogeneous
%...
end
classdef Line < Path
%...
end
classdef Arc < Path
%...
end
path = [Line,Line,Arc,Line,Arc,Arc];
figure, hold on
for i=1:numel(path)
path(i).plotCurve;
end

我在这里找到了这个:https://www.mathworks.com/matlabcentral/answers/4354-matlab-handle-class-violates-polymorphism-on-handle-equivalence

尽管我认为将path作为单元数组更容易,但在上面的代码中,除了使用不同的索引:path{i}.plotCurve之外,行为没有什么不同。

根据@Cris的建议,我建议进行一个类似于以下(未经测试(的改进

classdef Path < matlab.mixin.Heterogeneous
methods (Abstract, Access = protected)
plotOne(obj)
end
methods (Sealed)
function plotAll(objs)
figure; hold on;
for obj = objs(:).' % loop over all elements
plotOne(obj);
end
end
end 
end

这允许您在Path的数组上调用plotAll方法——该方法必须是Sealed。它打开数组,在每个元素上调用单独的plotOne方法。

相关内容

  • 没有找到相关文章