exponenta event banner

matlab.mixin.Копируемый класс

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

Примечание

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

Подробнее

развернуть все

Представлен в R2011a