Копирование переменной указателя приводит к другой переменной указателя, которая относится к тому же объекту. Можно добавить функциональность копии в класс 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);