Копирование переменной handle приводит к появлению другой переменной handle, которая ссылается на тот же объект. Вы можете добавить функциональность копирования к классу Handle путем подкласса matlab.mixin.Copyable
. Унаследованный copy
метод позволяет вам делать неглубокие копии объектов класса. The 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
. The matlab.mixin.Copyable
класс является абстрактным базовым классом, производным от класса handle. matlab.mixin.Copyable
предоставляет шаблон для настройки операций копирования объектов путем определения:
copy
- Запечатанный метод, который определяет интерфейс для копирования объектов
copyElement
- Защищенный метод, который подклассы могут переопределить, чтобы настроить операции копирования объектов для подкласса
The 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
The 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
The ColorProp
класс определяет цвет путем присвоения значения RGB его Color
свойство.
classdef ColorProp < handle properties Color = 'blue'; end end
Используйте NonCopyable
атрибут свойства, указывающий, что операция копирования не должна копировать то или иное значение свойства. По умолчанию NonCopyable
является false
, что указывает, что значение свойства является копируемым. Можно задать NonCopyable
на true
только на свойствах классов handle.
Для классов, которые получают из 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);