Класс совместим с указатель, если:
Это класс handle
Его HandleCompatible для атрибута задано значение true
The HandleCompatible атрибут класса определяет классы, которые можно объединить с классами handle при задании набора суперклассов.
Совместимость с указатель обеспечивает большую гибкость при определении абстрактных суперклассов. Например, при использовании суперклассов, которые поддерживают как подклассы указатель, так и подклассы value, совместимость handle устраняет необходимость определять и версию указатель, и неуказатель класса.
The 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
The Utility класс совместим с указателем. Поэтому можно использовать его в деривации классов, которые являются классами handle или классами значений. Информацию об использовании классов метаданных см. в разделах «Интроспекция классов» и «Метаданные».
The resetDefaults метод, заданный как Utility класс возвращает изменяемый объект. Когда вы звоните resetDefaults с объектом значение, метод должен вернуть измененный объект. Важно реализовать методы, которые работают как с объектами указатель, так и с объектами value в совместимом суперклассе указатель. Дополнительные сведения об изменении объектов указателя и значения см. в разделе Изменение объекта.
Рассмотрим поведение класса значений, который подклассифицирует Utility класс. The 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, убедитесь, что все методы работают с обоими видами классов.
Согласно правилам, описанным в Указатель Compatibility Rules, когда вы комбинируете указатель суперкласс с совместимым с указателем суперклассом, результатом является указателя подкласс, который указатель совместим.
Однако подклассификация класса, совместимого с указателем, не обязательно приводит к совместимости подкласса с обработкой. Рассмотрим следующие два случая, которые демонстрируют два возможных результата.
Предположим, что вы задаете класс, который подклассы класс handle, и указатель совместимый Utility класс, обсуждаемый в A Handle Compatible Class. The HPropertyDefaults класс имеет следующие характеристики:
Это класс handle (он выводится из handle).
Все его суперклассы указателя совместимы (классы handle указателя совместимы по определению).
classdef HPropertyDefaults < handle & Utility properties GraphPrim = line Width = 1.5 Color = 'black' end end
The HPropertyDefaults класс совместим с указателем:
hpd = HPropertyDefaults; mc = metaclass(hpd); mc.HandleCompatible
ans =
1Если вы подклассируете и класс значений, который не является совместимым, и класс, совместимый с указатель, то подкласс является несовместимым классом значений. The ValueSub класс:
Является классом значений (он не выводится из handle.)
Один из его суперклассов совместим с указателем (Utility класс).
classdef ValueSub < MException & Utility methods function obj = ValueSub(str1,str2) obj = obj@MException(str1,str2); end end end
The ValueSub класс является несовместимым с handle классом значений, поскольку MException класс не задает HandleCompatible атрибут как true:
hv = ValueSub('MATLAB:narginchk:notEnoughInputs',... 'Not enough input arguments.'); mc = metaclass(hv); mc.HandleCompatible
ans =
0