Пакет: matlab.mixin Пакет
Суперкласс, обеспечивающий функциональность копирования для объектов-дескрипторов
matlab.mixin.Copyable класс является абстрактным классом дескриптора, который предоставляет copy способ копирования объектов-дескрипторов. copy делает неглубокую копию объекта (то есть неглубоко-копирует все не зависящие свойства из исходного объекта в целевой объект). MATLAB ® не вызываетcopy рекурсивно для любых дескрипторов, содержащихся в значениях свойств.
Подкласс matlab.mixin.Copyable для определения классов-дескрипторов, наследующих copy способ. Метод копирования копирует данные без вызова конструктора класса или функций набора свойств. Поэтому он не вызывает побочных эффектов.
Подклассы могут настраивать поведение копирования путем получения из matlab.mixin.Copyable и переопределение copyElement способ. Для получения дополнительной информации см. пример Настройка поведения копирования подкласса.
matlab.mixin.Copyable класс является handle класс.
Abstract | true |
ConstructOnLoad | true |
HandleCompatible | true |
Сведения об атрибутах класса см. в разделе Атрибуты класса.
Добавление метода копирования в класс дескрипторов путем подкласса matlab.mixin.Copyable.
classdef MyClass < matlab.mixin.Copyable properties Prop end end
Создание объекта.
a = MyClass;
Создайте копию объекта.
b = copy(a);
Дополнительные сведения см. в разделе Реализация копирования для классов дескрипторов.
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: 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: 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 копирует свойство private подкласса, поскольку суперкласс не может получить доступ к данным private в подклассе.
Примечание
Присвоение 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 поскольку экземпляры, которые можно создать, ограничены экземплярами, определенными внутри блока перечисления. Дополнительные сведения о классах перечисления см. в разделе Определение классов перечисления.