【问题标题】:Customize display of an enumeration class自定义枚举类的显示
【发布时间】:2014-07-11 17:15:04
【问题描述】:

我想使用matlab.mixin.CustomDisplay自定义枚举类的显示。

如果我有一个常规(非枚举)类,如下所示:

classdef test < handle & matlab.mixin.CustomDisplay
    properties
       value
    end
    methods
        function obj = test(value)
           obj.value = value;
        end
    end
    methods (Access = protected)
    function displayScalarObject(obj)
        disp(['hello ', num2str(obj.value)])
    end
    end
end

然后一切正常 - 例如,

>> a = test(1)
a = 
hello 1

但如果我有如下枚举类(注意添加了enumeration 块):

classdef test < handle & matlab.mixin.CustomDisplay
    properties
       value
    end
    methods
        function obj = test(value)
           obj.value = value;
        end
    end
    methods (Access = protected)
    function displayScalarObject(obj)
        disp(['hello ', num2str(obj.value)])
    end
    end
    enumeration
        enum1(1)
    end
end

那么显示不是自定义的-例如,

>> a = test.enum1
a = 
    enum1

使用调试器,我可以看到我的 displayScalarObject 方法从未被调用。实现matlab.mixin.CustomDisplay 的其他方法,例如displayNonScalarObject 等似乎没有帮助 - 这些也永远不会被调用。

发生了什么事? disp 和 display 对于枚举类的工作方式是否不同,以至于被 matlab.mixin.CustomDisplay 覆盖的任何内容都会被忽略?

有没有办法使用matlab.mixin.CustomDisplay 获得自定义显示,但使用枚举类?

PS 我可以在不继承自matlab.mixin.CustomDisplay 的枚举类上直接重载disp 和/或display,这很好用。但如果可能的话,我希望使用matlab.mixin.CustomDisplay。

【问题讨论】:

  • 这看起来像是一个限制,但我不认为这是一个不合理的限制。枚举应该用描述性名称来表示实体(而不是使用幻数或硬编码字符串)。 IMO 枚举的名称本身应该具有足够的描述性,以至于不需要重载disp(直接或间接使用matlab.mixin.CustomDisplay)。我意识到这里存在不一致之处,看到重载 disp 有效,而 matlab.mixin.CustomDisplay 无效,我仍然认为无论哪种方式都不需要这样做..
  • @Amro 我知道你在说什么,我同意标量。但我上面的问题实际上是我真正需要的简化 - 我有一个枚举类,当我有一个值数组时,它会从自定义显示中受益(我想显示一个包含数组每个元素的符号的网格,而不是而不是说“myClass 的 2x4 数组”)。
  • 我认为显示枚举数组的默认方式与您想要的类似:repmat(test.enum1,[2 4]) 将显示符号网格(未自定义的符号)。如果这不符合您的要求,恐怕您将不得不手动覆盖disp 并编写代码来处理标量与数组的情况(基本上自己重新实现 CustomDisplay 的输出)。无论如何您应该提交一个错误向 MathWorks 报告让他们知道,至少他们会确认这是一个错误或未记录的限制..

标签: matlab oop enums string-formatting overriding


【解决方案1】:

如果其他人感兴趣,我会回答我自己的问题。

这个问题是参考 MATLAB R2014a 提出的。在 R2014b 中,matlab.mixin.CustomDisplay 的文档中添加了附加注释,明确指出不能使用 matlab.mixin.CustomDisplay 为枚举类派生自定义显示,并建议最好的方法是重载 @987654323 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    相关资源
    最近更新 更多