Как задать совместимые с 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

Похожие темы