matlab.mixin. Класс Copyable

Пакет: matlab.mixin

Суперкласс, обеспечивающий функциональность копии для объектов указателя

Описание

Класс matlab.mixin.Copyable является абстрактным классом Handle, который предоставляет метод copy для копирования объектов указателя. Метод copy делает мелкую копию объекта (то есть, это мелкие копии все независимые свойства от исходного объекта до целевого объекта). MATLAB® не вызывает copy рекурсивно ни на каких указателях, содержавшихся в значениях свойств.

Разделите на подклассы matlab.mixin.Copyable, чтобы задать классы Handle, которые наследовали метод copy. Метод copy. Метод копии копирует данные, не вызывая функции набора свойств или конструктор класса. Это поэтому не производит побочных эффектов.

Подклассы могут настроить поведение копии путем получения от matlab.mixin.Copyable и переопределения метода copyElement. Для получения дополнительной информации смотрите, что пример Настраивает Поведение Копии Подкласса.

Класс matlab.mixin.Copyable является классом handle.

Атрибуты класса

Краткий обзор

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

ShallowCp класса handle не выводит от 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 вызывает метод набора свойств, если вы существуете, возможно представляя побочные эффекты операции копии.

Копирование поведений для определенных вводов

Рассмотрите вызов метода copy matlab.mixin.Copyable этой формы:

B = copy(A);

Этот вызов copy приводит к результатам, описанным для каждого из следующих условий:

  • A имеет динамические свойства — copy не копирует динамические свойства. Можно реализовать копирование динамического свойства в подклассе в случае необходимости.

  • A не имеет никаких независимых свойств — copy создает новый объект без значений свойств, не вызывая конструктора класса, чтобы не представлять побочные эффекты.

  • A содержит удаленные указатели — copy создает удаленные указатели того же класса в выходном массиве.

  • A присоединил прослушиватели — copy не копирует прослушиватели.

  • A содержит объекты классов перечисления — классы Перечисления не могут разделить на подклассы matlab.mixin.Copyable.

  • delete вызовы метода copycopy создает законную копию, повинуясь всем поведениям, которые применяются в любом другом использовании.

Примечание

Вы не можете вывести класс перечисления от matlab.mixin.Copyable, потому что экземпляры, которые можно создать, ограничиваются теми заданными в блоке перечисления. Смотрите Задают Классы Перечисления для получения дополнительной информации о классах перечисления.

Больше о

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

Введенный в R2011a

Была ли эта тема полезной?