Пакет: matlab.mixin
Суперкласс, обеспечивающий функциональность копии для объектов указателя
Класс matlab.mixin.Copyable
является абстрактным классом Handle, который предоставляет метод copy
для копирования объектов указателя. Метод copy
делает мелкую копию объекта (то есть, это мелкие копии все независимые свойства от исходного объекта до целевого объекта). MATLAB® не вызывает copy
рекурсивно ни на каких указателях, содержавшихся в значениях свойств.
Разделите на подклассы matlab.mixin.Copyable
, чтобы задать классы Handle, которые наследовали метод copy
. Метод copy
. Метод копии копирует данные, не вызывая функции набора свойств или конструктор класса. Это поэтому не производит побочных эффектов.
Подклассы могут настроить поведение копии путем получения от matlab.mixin.Copyable
и переопределения метода copyElement
. Для получения дополнительной информации смотрите, что пример Настраивает Поведение Копии Подкласса.
Класс matlab.mixin.Copyable
является классом handle
.
Краткий обзор | tRUE |
ConstructOnLoad | tRUE |
HandleCompatible | tRUE |
Для получения информации об атрибутах класса см. Атрибуты класса.
Добавьте метод копии в свой класс Handle путем разделения на подклассы matlab.mixin.Copyable
.
classdef MyClass < matlab.mixin.Copyable properties Prop end end
Создайте объект.
a = MyClass;
Создайте копию объекта.
b = copy(a);
Для получения дополнительной информации см. Копию Реализации для Классов Handle.
Метод 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
Класс DeepCp
выводит от matlab.mixin.Copyable
.
classdef DeepCp < matlab.mixin.Copyable properties DpProp end methods function obj = DeepCp(val) ... end end end
ShallowCp
класса handle
не выводит от 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
Метод 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
вызывает метод набора свойств, если вы существуете, возможно вводя побочные эффекты операции копии.
Рассмотрите вызов
метода copy
matlab.mixin.Copyable
этой формы:
B = copy(A);
Этот вызов copy
приводит к результатам, описанным для каждого из следующих условий:
A
имеет динамические свойства — copy
не копирует динамические свойства. Можно реализовать копирование динамического свойства в подклассе в случае необходимости.
A
не имеет никаких независимых свойств — copy
создает новый объект без значений свойств, не вызывая конструктора класса, чтобы не вводить побочные эффекты.
A
содержит удаленные указатели — copy
создает удаленные указатели того же класса в выходном массиве.
A
присоединил прослушиватели — copy
не копирует прослушиватели.
A
содержит объекты классов перечисления — классы Перечисления не могут разделить на подклассы matlab.mixin.Copyable
.
delete
вызовы метода copy
— copy
создает законную копию, повинуясь всем поведениям, которые применяются в любом другом использовании.
Вы не можете вывести класс перечисления от matlab.mixin.Copyable
, потому что экземпляры, которые можно создать, ограничиваются теми заданными в блоке перечисления. Смотрите Задают Классы Перечисления для получения дополнительной информации о классах перечисления.