Класс является указателем, совместимым если:
Это - класс 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