matlab.mixin.Copyable class

Пакет: 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 вызывается метод copycopy создает легитимную копию, подчиняясь всем поведениям, применяемым при любом другом использовании.

Примечание

Вы не можете вывести класс перечисления из matlab.mixin.Copyable поскольку образцы, которые вы можете создать, ограничены таковыми, заданной внутри блока перечисления. Дополнительные сведения о классах перечисления см. в разделе «Определение классов перечисления».

Подробнее о

расширить все

Введенный в R2011a