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