Класс совместим с дескриптором, если:
Это класс дескрипторов
Его HandleCompatible атрибут имеет значение true
HandleCompatible атрибут class определяет классы, которые можно объединить с классами дескрипторов при указании набора суперклассов.
Совместимость дескрипторов обеспечивает большую гибкость при определении абстрактных суперклассов. Например, при использовании суперклассов, поддерживающих подклассы дескрипторов и значений, совместимость дескрипторов устраняет необходимость определения как версии дескриптора, так и нерабочей версии класса.
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 класс совместим с дескриптором. Поэтому его можно использовать при деривации классов, которые являются либо классами обработки, либо классами значений. Сведения об использовании классов метаданных см. в разделе Самоанализ классов и метаданные.
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 класс не является классом дескриптора, возвращает измененный объект.
pd = pd.resetDefaults
pd =
PropertyDefaults with properties:
p1: ' 4:54 PM'
p2: 'red'
p3: 1.5708
Если PropertyDefaults класс был классом дескриптора, тогда не нужно было бы сохранять объект, возвращенный resetDefaults способ. Чтобы разработать дескриптор совместимого класса, как Utility, убедитесь, что все методы работают с обоими видами классов.
Согласно правилам, описанным в разделе Правила совместимости дескрипторов (Handle Compatibility Rules), при объединении суперкласса дескриптора с суперклассом, совместимым с дескриптором, получается подкласс дескриптора, совместимый с дескриптором.
Однако подкласс класса, совместимого с дескриптором, не обязательно приводит к тому, что подкласс совместим с дескриптором. Рассмотрим следующие два случая, которые демонстрируют два возможных результата.
Предположим, что вы определяете класс, который подкласс класса дескриптора, и дескриптор совместим Utility класс, обсуждаемый в A Handle Compatible Class. HPropertyDefaults класс имеет следующие характеристики:
Это класс дескриптора (он является производным от 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 класс является классом значений, не совместимым с handle, поскольку MException класс не определяет HandleCompatible атрибут как true:
hv = ValueSub('MATLAB:narginchk:notEnoughInputs',... 'Not enough input arguments.'); mc = metaclass(hv); mc.HandleCompatible
ans =
0