Customize display of an enumeration class

2019-05-21 08:01发布

问题:

I'd like to customize the display of an enumeration class using matlab.mixin.CustomDisplay.

If I have a regular (non-enumeration) class such as the following:

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

then everything works fine - for example,

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

But if I have an enumeration class such as the following (note the addition of the enumeration block):

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

then the display is not customized - for example,

>> a = test.enum1
a = 
    enum1

Using the debugger, I can see that my displayScalarObject method is never called. Implementing other methods of matlab.mixin.CustomDisplay such as displayNonScalarObject and so on doesn't seem to help - these never get called either.

What's going on? Do disp and display work differently for enumeration classes, in such a way that anything that's overridden by matlab.mixin.CustomDisplay just gets ignored?

Is there a way to get a customized display with matlab.mixin.CustomDisplay, but using an enumeration class?

PS I am able to directly overload disp and/or display on an enumeration class that does not inherit from matlab.mixin.CustomDisplay, and this works fine. But I'm looking to use matlab.mixin.CustomDisplay if possible.

回答1:

I'll answer my own question in case anyone else is interested.

The question was asked with reference to MATLAB R2014a. In R2014b, an additional note has been added to the documentation for matlab.mixin.CustomDisplay, making it explicit that it is not possible to use matlab.mixin.CustomDisplay to derive a custom display for enumeration classes, and suggesting that the best approach is to overload disp.