exponenta event banner

Определение классов, совместимых с дескрипторами

Что такое совместимость дескрипторов?

Класс совместим с дескриптором, если:

  • Это класс дескрипторов

  • Его HandleCompatible атрибут имеет значение true

HandleCompatible атрибут class определяет классы, которые можно объединить с классами дескрипторов при указании набора суперклассов.

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

Класс, совместимый с дескриптором

Utility класс полезен как для подклассов дескрипторов, так и для подклассов значений. В этом примере Utility класс определяет метод сброса значений свойств до значений по умолчанию, определенных в соответствующем определении класса:

classdef (HandleCompatible) Utility
   methods
      function obj = resetDefaults(obj)
         mc = metaclass(obj);
         mp = mc.PropertyList;
         for k=1:length(mp)
            if mp(k).HasDefault && ~strcmp(mp(k).SetAccess,'private')
               obj.(mp(k).Name) = mp(k).DefaultValue;
            end
         end
      end
   end
end

Utility класс совместим с дескриптором. Поэтому его можно использовать при деривации классов, которые являются либо классами обработки, либо классами значений. Сведения об использовании классов метаданных см. в разделе Самоанализ классов и метаданные.

Возврат измененных объектов

resetDefaults метод, определенный Utility возвращает объект, который он изменяет. При звонке resetDefaults с объектом значения метод должен возвращать измененный объект. Важно реализовать методы, которые работают как с объектами дескриптора, так и со значениями в суперклассе, совместимом с дескриптором. Дополнительные сведения об изменении объектов-дескрипторов и значений см. в разделе Изменение объекта.

Рассмотрим поведение класса значений, который подкласс Utility класс. PropertyDefaults класс определяет три свойства, все из которых имеют значения по умолчанию:

classdef PropertyDefaults < Utility
   properties
      p1 = datestr(rem(now,1)) % Current time
      p2 = 'red'               % Character vector
      p3 = pi/2                % Result of division operation
   end
end

Создать PropertyDefaults объект. MATLAB ® вычисляет выражения, назначенные в качестве значений свойств по умолчанию при первой загрузке класса. MATLAB использует те же самые значения по умолчанию при создании экземпляра этого класса в текущем сеансе MATLAB .

pd = PropertyDefaults
pd = 

  PropertyDefaults with properties:

    p1: ' 4:42 PM'
    p2: 'red'
    p3: 1.5708

Назначьте новые значения, отличные от значений по умолчанию:

pd.p1 = datestr(rem(now,1));
pd.p2 = 'green';
pd.p3 = pi/4;

Все pd значения свойств объекта теперь содержат значения, которые отличаются от значений по умолчанию, первоначально определенных классом:

pd
pd = 

  PropertyDefaults with properties:
:
    p1: ' 4:45 PM'
    p2: 'green'
    p3: 0.7854

Позвоните в resetDefaults , который наследуется от Utility класс. Потому что PropertyDefaults класс не является классом дескриптора, возвращает измененный объект.

pd = pd.resetDefaults
pd = 

  PropertyDefaults with properties:

    p1: ' 4:54 PM'
    p2: 'red'
    p3: 1.5708

Если PropertyDefaults класс был классом дескриптора, тогда не нужно было бы сохранять объект, возвращенный resetDefaults способ. Чтобы разработать дескриптор совместимого класса, как Utility, убедитесь, что все методы работают с обоими видами классов.

Классы, совместимые с дескрипторами подкласса

Согласно правилам, описанным в разделе Правила совместимости дескрипторов (Handle Compatibility Rules), при объединении суперкласса дескриптора с суперклассом, совместимым с дескриптором, получается подкласс дескриптора, совместимый с дескриптором.

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

Объединение класса служебной программы без управления с классами дескрипторов

Предположим, что вы определяете класс, который подкласс класса дескриптора, и дескриптор совместим Utility класс, обсуждаемый в A Handle Compatible Class. HPropertyDefaults класс имеет следующие характеристики:

  • Это класс дескриптора (он является производным от handle).

  • Все его суперклассы совместимы с дескрипторами (классы дескрипторов совместимы по определению).

classdef HPropertyDefaults < handle & Utility
   properties
      GraphPrim = line
      Width = 1.5
      Color = 'black'
   end
end

HPropertyDefaults класс совместим с дескриптором:

hpd = HPropertyDefaults;
mc = metaclass(hpd);
mc.HandleCompatible
ans =

     1

Неконтактные подклассы класса, совместимого с дескриптором

Если подкласс является классом значений, не совместимым с дескриптором, и классом, совместимым с дескриптором, подкласс является классом значений, не совместимым с дескриптором. ValueSub класс:

  • Является классом значений (он не является производным от handle.)

  • Один из его суперклассов совместим с дескриптором ( Utility класс).

classdef ValueSub < MException & Utility
   methods
      function obj = ValueSub(str1,str2)
         obj = obj@MException(str1,str2);
      end
   end
end

ValueSub класс является классом значений, не совместимым с handle, поскольку MException класс не определяет HandleCompatible атрибут как true:

hv = ValueSub('MATLAB:narginchk:notEnoughInputs',...
      'Not enough input arguments.');
mc = metaclass(hv);
mc.HandleCompatible
ans =

     0

Связанные темы