【问题标题】:How to store objects from different classes in one array and call the same function (which definitions are different) in MATLAB?如何将来自不同类的对象存储在一个数组中并在 MATLAB 中调用相同的函数(定义不同)?
【发布时间】:2020-11-19 19:18:47
【问题描述】:

我有两个子类:

  • 弧线

它们的对象将通过将它们附加到它们的末端来创建路径。这些都有自己的“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 对象也是如此)。

【问题讨论】:

  • 我们期望 line 和 arc 是什么数据类型/变量类型?
  • 这些是类,每个类有 10-15 个浮点属性。
  • 这种情况下不需要继承。使path 成为一个单元格数组,您可以使用两个类的对象(或其他任何东西)填充它。然后就可以调用每个对象的plotCurve方法,只要对象定义了这样的方法就可以了。
  • @CrisLuengo 是的,你是对的。这实际上是我已经做到的。但是,我想知道如何在不使用单元格数组的情况下使用 oop。

标签: matlab oop interface subclass superclass


【解决方案1】:

根据@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 方法。

【讨论】:

    【解决方案2】:

    看起来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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      相关资源
      最近更新 更多