Пакет: matlab.mixin Пакет
Суперкласс, обеспечивающий функциональность копирования для указателя объектов
The matlab.mixin.Copyable класс является абстрактным классом Handle, который обеспечивает copy метод копирования указателя объектов. copy метод делает мелкую копию объекта (то есть мелкую - копирует все независимые свойства из исходного объекта в целевой объект). MATLAB® не вызывает copy рекурсивно на любых указателях, содержащихся в значениях свойств.
Подкласс matlab.mixin.Copyable чтобы задать классы handle, которые наследуют copy способ. Метод копирования копирует данные, не вызывая конструктор классов или функции набора свойств. Поэтому он не производит побочных эффектов.
Подклассы могут настраивать поведение копирования путем вывода из matlab.mixin.Copyable и переопределение copyElement способ. Для получения дополнительной информации см. пример Настройка поведения при копировании подкласса.
The matlab.mixin.Copyable класс является handle класс.
Abstract | true |
ConstructOnLoad | true |
HandleCompatible | true |
Для получения информации об атрибутах класса см. раздел «Атрибуты класса».
Добавьте метод копирования к классу Handle путем подклассирования matlab.mixin.Copyable.
classdef MyClass < matlab.mixin.Copyable properties Prop end end
Создайте объект.
a = MyClass;
Создайте копию объекта.
b = copy(a);
Для получения дополнительной информации смотрите Реализация копирования для классов Handle.
The copy метод предоставляет общедоступный, не переопределяемый интерфейс для копирования поведения. Этот метод принимает массив объектов как вход и возвращает массив тех же размерностей.
copyElement является защищенным методом, который copy метод использует, чтобы выполнить операцию копирования для каждого объекта в вход массиве. Можно переопределить copyElement в подклассе, чтобы настроить поведение унаследованных copy способ.
Используйте свойство NonCopyable атрибут для управления, если операция копирования копирует определенные значения свойств.
Этот пример переопределяет copyElement метод в подклассе matlab.mixin.Copyable для реализации глубокой копии определенного класса handle объекты.
Примите во внимание следующие классы:
ContainsHandles - подкласс matlab.mixin.Copyable который содержит handle объекты в двух свойствах
DeepCp - подкласс matlab.mixin.Copyable
ShallowCp - подкласс handle
Вот упрощенные определения классов.
classdef ContainsHandles < matlab.mixin.Copyable properties Prop1 Prop2 DeepObj % Contains a DeepCp object ShallowObj % Contains a ShallowCp object end methods function obj = ContainsHandles(val1,val2,deepobj,shallowobj) if nargin > 0 obj.Prop1 = val1; obj.Prop2 = val2; obj.DeepObj = deepobj; obj.ShallowObj = shallowobj; end end end methods(Access = protected) % Override copyElement method: function cpObj = copyElement(obj) % Make a shallow copy of all four properties cpObj = copyElement@matlab.mixin.Copyable(obj); % Make a deep copy of the DeepCp object cpObj.DeepObj = copy(obj.DeepObj); end end end
The DeepCp класс выводится из matlab.mixin.Copyable.
classdef DeepCp < matlab.mixin.Copyable properties DpProp end methods function obj = DeepCp(val) ... end end end
The handle классы ShallowCp не выводится из matlab.mixin.Copyable и, следовательно, не имеет copy способ.
classdef ShallowCp < handle properties ShProp end methods function obj = ShallowCp(val) ... end end end
Создайте ContainsHandles объект, который содержит два объекта указателя в своем DpProp и ShProp свойства.
sc = ShallowCp(7); dc = DeepCp(7); a = ContainsHandles(4,5,dc,sc); a.DeepObj
ans =
DeepCp with properties:
DpProp: 7a.ShallowObj.ShProp
ans =
ShallowCp with properties:
ShProp: 7Сделайте копию ContainsHandles объект.
b = copy(a);
Возвращенная копия b содержит неглубокую копию объекта scи глубокую копию объекта dc. То есть, dc объект передан в ContainsHandles конструктор теперь является новым, независимым объектом в результате операции копирования. Теперь можно изменить dc объект без влияния на копий. это не относится к мелкокопированному объекту, sc.
Измените значения свойств указателя объектов.
sc.ShProp = 5; dc.DpProp = 5;
Обратите внимание, что объект, который глубоко скопирован, не затронут.
b.DeepObj
ans =
DeepCp with properties:
DpProp: 7Неглубокий скопированный объект все еще ссылается на те же данные.
b.ShallowObj
ans =
ShallowCp with properties:
ShProp: 5The copyElement метод в суперклассе не может получить доступ к частным данным в подклассе.
Если вы переопределяете copyElement в подклассе matlab.mixin.Copyable, а затем используйте этот подкласс как суперкласс, нужно переопределить copyElement во всех подклассах, которые содержат частную собственность. Переопределение copyElement в подклассах следует вызвать copyElement в соответствующем суперклассе, как в предыдущем примере.
Следующий упрощенный код демонстрирует этот подход.
classdef SuperClass < matlab.mixin.Copyable properties(Access = private) super_prop end methods ... function cpObj = copyElement(obj) ... cpObj = copyElement@matlab.mixin.Copyable(obj); ... end end end classdef SubClass1 < SuperClass properties(Access=private) sub_prop1 end methods function cpObj = copyElement(obj) % Copy super_prop cpObj = copyElement@SuperClass(obj); % Copy sub_prop1 in subclass % Assignment can introduce side effects cpObj.sub_prop1 = obj.sub_prop1; end end end
Переопределение copyElement в SubClass1 копирует свойство частного подкласса, поскольку суперкласс не может получить доступ к частным данным в подклассе.
Примечание
Назначение sub_prop1 в переопределении copyElement в SubClass1 вызывает метод набора свойств, если он существует, возможно, вводит побочные эффекты в операцию копирования.
Рассмотрите вызов matlab.mixin.Copyable
copy метод этой формы:
B = copy(A);
Этот вызов для copy приводит к результатам, описанным для каждого из следующих условий:
A имеет динамические свойства - copy не копирует динамические свойства. При необходимости можно реализовать копирование динамических свойств в подкласс.
A не имеет зависимых свойств - copy создает новый объект без значений свойств, не вызывая конструктор классов, чтобы избежать введения побочных эффектов.
A содержит удаленные указатели - copy создает удаленные указатели того же класса в выход массиве.
A прикрепил прослушиватели - copy не копирует прослушиватели.
A содержит объекты классов перечисления - классы перечисления не могут подклассифицировать matlab.mixin.Copyable.
A delete вызывается метод copy — copy создает легитимную копию, подчиняясь всем поведениям, применяемым при любом другом использовании.
Примечание
Вы не можете вывести класс перечисления из matlab.mixin.Copyable поскольку образцы, которые вы можете создать, ограничены таковыми, заданной внутри блока перечисления. Дополнительные сведения о классах перечисления см. в разделе «Определение классов перечисления».