Как задать совместимые с указателями классы

Что такое совместимость с указателями?

Класс совместим с указатель, если:

  • Это класс handle

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

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

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

Класс, совместимый с указателем

The 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

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

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

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

Рассмотрим поведение класса значений, который подклассифицирует Utility класс. The 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 класс не является классом handle, возвращает измененный объект.

pd = pd.resetDefaults
pd = 

  PropertyDefaults with properties:

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

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

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

Согласно правилам, описанным в Указатель Compatibility Rules, когда вы комбинируете указатель суперкласс с совместимым с указателем суперклассом, результатом является указателя подкласс, который указатель совместим.

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

Комбинируйте нешипованный класс утилиты с классами Handle

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

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

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

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

The HPropertyDefaults класс совместим с указателем:

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

     1

Неширокие подклассы совместимого с указателем класса

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

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

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

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

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

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

     0

Похожие темы