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

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

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

  • Это - класс Handle

  • Его HandleCompatible атрибут установлен в true

HandleCompatible атрибут класса идентифицирует классы, которые можно объединить с классами Handle при определении набора суперклассов.

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

Указатель совместимый класс

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 класс является совместимым указателем. Поэтому можно использовать его в деривации классов, которые являются или классами Handle или классами значения. Смотрите Самоанализ Класса и Метаданные для получения информации об использовании классов метаданных.

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

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 класс не является классом Handle, возвратите модифицированный объект.

pd = pd.resetDefaults
pd = 

  PropertyDefaults with properties:

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

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

Разделение на подклассы совместимых с Handle классов

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

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

Объединение класса утилиты неуказателя с Классами Handle

Предположим, что вы задаете класс, который разделяет на подклассы класс Handle и указатель совместимый Utility класс обсудил в Указателе Совместимый Класс. HPropertyDefaults класс имеет эти характеристики:

  • Это - класс Handle (это выводит из handle).

  • Все его суперклассы являются совместимым указателем (классы 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

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

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

  • Класс значения (он не выводит из handle.)

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

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

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

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

     0

Похожие темы