Класс является указателем, совместимым если:
Это - класс 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 и указатель совместимый класс 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Если вы разделяете на подклассы и класс значения, который не является совместимым указателем и указателем совместимый класс, подкласс является неуказателем совместимый класс значения. Класс 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