Копирование переменной дескриптора приводит к созданию другой переменной дескриптора, которая ссылается на тот же объект. Можно добавить функциональность копирования в класс дескрипторов путем подкласса matlab.mixin.Copyable. Унаследованный copy метод позволяет создавать неглубокие копии объектов класса. CopyObj показывает поведение операций копирования.
classdef CopyObj < matlab.mixin.Copyable properties Prop end end
Создание объекта CopyObj класс и назначить дескриптор line объект к свойству Prop.
a = CopyObj; a.Prop = line;
Скопируйте объект.
b = copy(a);
Убедитесь, что переменные-дескрипторы a и b относятся к различным объектам.
a == b
ans = logical 0
Тем не менее, line объект, на который ссылается a.Prop не был скопирован. Дескриптор, содержащийся в a.Prop относится к тому же объекту, что и дескриптор, содержащийся в b.Prop.
a.Prop == b.Prop
ans = logical 1
Дополнительные сведения о поведении операции копирования см. в разделе copy.
Настройка поведения копирования объектов с помощью деривации класса matlab.mixin.Copyable. matlab.mixin.Copyable - абстрактный базовый класс, производный от класса дескриптора. matlab.mixin.Copyable предоставляет шаблон для настройки операций копирования объектов путем определения:
copy - запечатанный метод, определяющий интерфейс для копирования объектов;
copyElement - защищенный метод, который подклассы могут переопределять для настройки операций копирования объектов для подкласса;
matlab.mixin.Copyable
copy метод, вызывает copyElement способ. Подкласс настраивает операцию копирования, определяя собственную версию copyElement.
Реализация по умолчанию copyElement делает неглубокие копии всех не зависящих свойств. copyElement копирует каждое значение свойства и назначает его новому (скопированному) свойству. Если значение свойства является объектом-дескриптором, copyElement копирует дескриптор, но не базовые данные.
Для реализации различных методов копирования для различных свойств переопределите copyElement. Например, copyElement способ SpecializedCopy класс:
Создание нового объекта класса
Копирует значение Prop1 в новый объект
Повторная инициализация значения по умолчанию Prop2 путем добавления метки времени при создании копии
classdef SpecializedCopy < matlab.mixin.Copyable properties Prop1 Prop2 = datestr(now) end methods(Access = protected) function cp = copyElement(obj) cp = SpecializedCopy; cp.Prop1 = obj.Prop1; cp.Prop2 = datestr(now); end end end
Создание объекта класса и назначение значения Prop1:
a = SpecializedCopy; a.Prop1 = 7
a =
SpecializedCopy with properties:
Prop1: 7
Prop2: '17-Feb-2015 17:51:23'Использовать унаследованные copy метод создания копии a:
b = copy(a)
b =
SpecializedCopy with properties:
Prop1: 7
Prop2: '17-Feb-2015 17:51:58'Копия (объект b) имеет одинаковое значение для Prop1, но подкласс copyElement метод назначил новое значение Prop2. Обратите внимание на различные метки времени.
При копировании объекта также копируются значения свойств объекта. Свойства объекта могут содержать другие объекты, включая объекты-дескрипторы. Если просто скопировать значение свойства, которое содержит объект-дескриптор, фактически копируется дескриптор, а не сам объект. Поэтому копия ссылается на тот же объект, что и исходный. Классы, производные от matlab.mixin.Copyable класс может настраивать способ копирования объектов класса методом копирования.
Предположим, что определен класс, хранящий дескриптор в свойстве объекта. Вы хотите иметь возможность копировать объекты класса и хотите, чтобы каждая копия объекта ссылалась на новый объект-дескриптор. Настройте поведение копирования класса, выполнив следующие действия.
Создание подкласса matlab.mixin.Copyable.
Отвергнуть copyElement для управления копированием свойства, содержащего дескриптор.
Поскольку значение свойства является дескриптором, создайте новый объект по умолчанию того же класса.
Скопируйте значения свойств из исходного объекта-дескриптора в новый объект-дескриптор.
Класс HandleCopy настраивает операции копирования для свойства, содержащего объект-дескриптор. Класс ColorProp определяет объект-дескриптор для назначения Prop2:
Создайте объект и назначьте значения свойств:
a = HandleCopy; a.Prop1 = 7; a.Prop2 = ColorProp;
Создание копии объекта с помощью copy метод, унаследованный от matlab.mixin.Copyable:
b = copy(a);
Демонстрация того, что объекты-дескрипторы содержатся в объектах a и b независимы. Изменение значения объекта a не влияет на объект b:
a.Prop2.Color = 'red'; b.Prop2.Color
ans = blue
HandleCopy настраивает операцию копирования для объектов этого класса.
classdef HandleCopy < matlab.mixin.Copyable properties Prop1 % Shallow copy Prop2 % Handle copy end methods (Access = protected) function cp = copyElement(obj) % Shallow copy object cp = copyElement@matlab.mixin.Copyable(obj); % Get handle from Prop2 hobj = obj.Prop2; % Create default object new_hobj = eval(class(hobj)); % Add public property values from orig object HandleCopy.propValues(new_hobj,hobj); % Assign the new object to property cp.Prop2 = new_hobj; end end methods (Static) function propValues(newObj,orgObj) pl = properties(orgObj); for k = 1:length(pl) if isprop(newObj,pl{k}) newObj.(pl{k}) = orgObj.(pl{k}); end end end end end
ColorProp класс определяет цвет, присваивая значение RGB Color собственность.
classdef ColorProp < handle properties Color = 'blue'; end end
Используйте NonCopyable атрибут свойства указывает на то, что операция копирования не должна копировать определенное значение свойства. По умолчанию NonCopyable является false, указывая, что значение свойства является копируемым. Можно задать NonCopyable кому true только для свойств классов дескрипторов.
Для классов, производных от matlab.mixin.Copyable, реализация по умолчанию copyElement чтит NonCopyable атрибут. Следовательно, если свойство имеет NonCopyable атрибут имеет значение true, то copyElement не копирует значение этого свойства. Если переопределить copyElement в подклассе можно выбрать, как использовать NonCopyable атрибут.
Набор NonCopyable кому true в блоке свойств:
properties (NonCopyable) Prop1 end
Если свойство, не подлежащее копированию, имеет значение по умолчанию, назначенное в определении класса, операция копирования присваивает свойству значение по умолчанию. Например, CopiedClass присваивает значение по умолчанию Prop2.
classdef CopiedClass < matlab.mixin.Copyable properties (NonCopyable) Prop1 Prop2 = datestr(now) % Assign current time end end
Создание объекта для копирования и назначения значения Prop1:
a = CopiedClass; a.Prop1 = 7
a =
CopiedClass with properties:
Prop1: 7
Prop2: '17-Feb-2015 15:19:34'Копия a кому b с использованием copy метод, унаследованный от matlab.mixin.Copyable:
b = copy(a)
b =
CopiedClass with properties:
Prop1: []
Prop2: '17-Feb-2015 15:19:34'В копии b, значение Prop1 не копируется. Значение Prop2 установлено значение по умолчанию, определяемое MATLAB ® при первой загрузке класса. Метка времени не изменяется.
Подклассы dynamicprops позволяет добавлять свойства к объекту класса. Когда класс является производным от dynamicprops также является подклассом matlab.mixin.Copyable, реализация по умолчанию copyElement не копирует динамические свойства. Значение по умолчанию NonCopyable является true для динамических свойств.
Реализация по умолчанию copyElement чтит значение динамического свойства NonCopyable атрибут. Если требуется разрешить копирование динамического свойства, задайте его NonCopyable атрибут для false. При копировании динамического свойства копируются значение свойства и значения атрибутов свойства.
Например, эта операция копирования копирует динамическое свойство, DynoProp, потому что его NonCopyable атрибут имеет значение false. Объект obj должен быть экземпляром класса, производного от обоих dynamicprops и matlab.mixin.Copyable:
obj = MyDynamicClass;
p = addprop(obj,'DynoProp');
p.NonCopyable = false;
obj2 = copy(obj);