Копирование переменной указателя приводит к другой переменной указателя, которая относится к тому же объекту. Можно добавить функциональность копии в класс Handle путем разделения на подклассы matlab.mixin.Copyable. Наследованный copy метод позволяет вам сделать мелкие копии объектов класса. CopyObj класс показывает поведение операций копии.
classdef CopyObj < matlab.mixin.Copyable properties Prop end end
Создайте объект CopyObj класс и присвоение указатель a 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 класс является абстрактным базовым классом, который выводит из класса Handle. 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, указание, что значение свойства copyable. Можно установить NonCopyable к true только на свойствах классов Handle.
Для классов, которые выводят из matlab.mixin.Copyable, реализация по умолчанию copyElement соблюдает NonCopyable атрибут. Поэтому, если свойство имеет свой NonCopyable припишите набор true, затем copyElement не копирует значение того свойства. Если вы заменяете copyElement в вашем подклассе можно выбрать, как использовать NonCopyable атрибут.
Установите NonCopyable к true в блоке свойства:
properties (NonCopyable) Prop1 end
Если свойству, которое не copyable, присвоили значение по умолчанию в определении класса, операция копии присваивает значение по умолчанию свойству. Например, 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);