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