Скрыть представителей перечисления

Скрытие представителей перечисления позволяет авторам классов изменять имена представителей перечисления, не вызывая несовместимости в существующем коде. Чтобы скрыть представителей, создайте блок перечисления, который устанавливает Hidden атрибут. Представители, определенные в Hidden блок перечисления не виден, когда представители перечисления запрашиваются с помощью enumeration функция.

Когда класс перечисления происходит от другого класса, такого как числовой или логический класс, то каждый представитель может иметь значение, сопоставленное с ним. Если два представителей имеют одинаковое значение, то представитель, заданный первым в определении класса, маскирует второй представитель. Оба имени являются допустимыми представителями перечисления, но первое определено как основной представитель. Хотя маскировка позволяет использовать одно имя представителя вместо другого, она не скрывает вторичное имя от пользователей класса.

Использование Hidden атрибут удаляет маскированные имена представителей из пользовательского представления. Для примера, HighlightColor класс задает представителей перечисления, которые представляют синтаксические подсвечивающие цвета.

classdef HighlightColor < int32
    enumeration
        red   (1)
        green (2)
        blue  (3)
    end
end

Новая версия класса использует более описательные имена представителей, но класс должен избегать нарушения существующего кода, который использует исходные имена представителей, красный, зеленый и синий. Использование Hidden атрибут для представителей перечисления позволяет классу скрывать исходные представители.

classdef HighlightColor < int32
    enumeration
        error   (1)
        comment (2)
        keyword (3)
    end
    enumeration (Hidden)
        red   (1)
        green (2)
        blue  (3)
    end
end

Код, который использует исходные имена представителей, продолжает работать. Например, существующие ссылки на теперь скрытый представитель HighlightColor.blue совместим с одним и тем же ценным нескрываемым представителем HighlightColor.keyword.

% 
a = HighlightColor.blue
a = 

  HighlightColor enumeration

    keyword
a == HighlightColor.Keyword
ans =

  logical

   1

Для представителей перечисления, которые представляют значения, первый представитель, заданный в классе, является основным представителем для этого значения. Для примера, в HighlightColor класс, keyword является основным представителем и blue является вторичным представителем, оба представляют значение 3. Обычно основной представитель не скрыт, а вторичный представитель скрыт. Однако, если проект класса требует, чтобы основной представитель был скрыт, то вторичный представитель должен быть также скрыт.

Скрыть чистые перечисления

Чистые представители перечисления не имеют базовых значений, поэтому нет возможности идентифицировать один представителя как замену другому. Однако можно использовать Hidden атрибут для удаления представителя из пользовательского представления, избегая при этом несовместимости с существующим использованием скрытого представителя.

Для примера, PCComponents класс задает перечисления, которые используются в интерактивной форме для порядка компьютера. В то время как FloppyDrive компонент устарел, представитель перечисления может остаться в классе как скрытый представитель. Форма может исключить FloppyDrive из списка вариантов, но автор классов может сохранить этот представитель доступным, так что существующие формы, которые ссылаются на FloppyDrive все еще действительны.

classdef PCComponents
    enumeration
        USBSlots
        CDPlayer
    end
    enumeration (Hidden)
        FloppyDrive
    end
end

Поиск скрытых представителей перечисления

Поиск сведений о скрытых представителях перечисления с помощью метаданных классов. The meta.EnumeratedValue класс содержит информацию о представителях перечисления. Для примера доступ к метаданным для HighlightColor класс, используемый в предыдущих примерах, может показывать имена скрытых представителей.

mc =?HighlightColor
mc = 

  class with properties:

                     Name: 'HighlightColor'
              Description: ''
      DetailedDescription: ''
                   Hidden: 0
                   Sealed: 0
                 Abstract: 0
              Enumeration: 1
          ConstructOnLoad: 0
         HandleCompatible: 0
          InferiorClasses: {[1×1 meta.class]}
        ContainingPackage: [0×0 meta.package]
     RestrictsSubclassing: 0
             PropertyList: [0×1 meta.property]
               MethodList: [140×1 meta.method]
                EventList: [0×1 meta.event]
    EnumerationMemberList: [6×1 meta.EnumeratedValue]
           SuperclassList: [1×1 meta.class]

Каждый представитель перечисления описывается meta.EnumeratedValue объект, который содержится в EnumerationMemberList свойство. Для примера - четвертый элемент в EnumerationMemberList массив содержит meta.EnumerationValue объект для представителя с именем red.

mc.EnumerationMemberList(4)
ans = 

  EnumeratedValue with properties:

                   Name: 'red'
            Description: ''
    DetailedDescription: ''
                 Hidden: 1

Чтобы перечислить имена всех скрытых представителей, используйте класс handle findobj метод:

 findobj(mc.EnumerationMemberList,'Hidden',true).Name
ans =

    'red'


ans =

    'green'


ans =

    'blue'

См. также

|