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