【发布时间】: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