Пакет: matlab.mixin
Суперкласс, обеспечивающий функциональность копии для объектов указателя
matlab.mixin.Copyable
класс является абстрактным классом Handle, который обеспечивает copy
метод для копирования объектов указателя. copy
метод делает мелкую копию объекта (то есть, это мелкие копии все независимые свойства от исходного объекта до целевого объекта). MATLAB® не вызывает copy
рекурсивно на любых указателях содержится в значениях свойств.
Разделите на подклассы matlab.mixin.Copyable
задавать классы Handle, которые наследовали copy
метод. Метод копии копирует данные, не вызывая функции набора свойств или конструктор класса. Это поэтому не производит побочных эффектов.
Подклассы могут настроить поведение копии путем получения из matlab.mixin.Copyable
и переопределение copyElement
метод. Для получения дополнительной информации смотрите, что пример Настраивает Поведение Копии Подкласса.
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.
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
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
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
.
delete
вызовы метода copy
копия
создает законную копию, выполняя все поведения, которые применяются в любом другом использовании.
Вы не можете вывести класс перечисления из matlab.mixin.Copyable
потому что экземпляры, которые можно создать, ограничиваются теми заданными в блоке перечисления. Смотрите Задают Классы Перечисления для получения дополнительной информации о классах перечисления.