matlab.mixin.Copyable class

Пакет: 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 объект, который содержит два объекта указателя в его DeepObj и ShallowObj свойства.

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 потому что экземпляры, которые можно создать, ограничиваются теми заданными в блоке перечисления. Смотрите Задают Классы Перечисления для получения дополнительной информации о классах перечисления.

Больше о

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

Введенный в R2011a