Пакет: 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: 7
a.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: 5
The 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
поскольку образцы, которые вы можете создать, ограничены таковыми, заданной внутри блока перечисления. Дополнительные сведения о классах перечисления см. в разделе «Определение классов перечисления».