我有两个子类:
- 线路
- 弧形
它们的对象将通过在末端附加它们来创建路径。这些都有自己的";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
方法。