exponenta event banner

Реализация копирования для классов дескрипторов

Метод копирования для классов дескрипторов

Копирование переменной дескриптора приводит к созданию другой переменной дескриптора, которая ссылается на тот же объект. Можно добавить функциональность копирования в класс дескрипторов путем подкласса matlab.mixin.Copyable. Унаследованный copy метод позволяет создавать неглубокие копии объектов класса. CopyObj показывает поведение операций копирования.

classdef CopyObj < matlab.mixin.Copyable
   properties
      Prop
   end
end

Создание объекта CopyObj класс и назначить дескриптор line объект к свойству Prop.

a = CopyObj;
a.Prop = line;

Скопируйте объект.

b = copy(a);

Убедитесь, что переменные-дескрипторы a и b относятся к различным объектам.

a == b
ans =

  logical

   0

Тем не менее, line объект, на который ссылается a.Prop не был скопирован. Дескриптор, содержащийся в a.Prop относится к тому же объекту, что и дескриптор, содержащийся в b.Prop.

a.Prop == b.Prop
ans =

  logical

   1

Дополнительные сведения о поведении операции копирования см. в разделе copy.

Настройка операции копирования

Настройка поведения копирования объектов с помощью деривации класса matlab.mixin.Copyable. matlab.mixin.Copyable - абстрактный базовый класс, производный от класса дескриптора. matlab.mixin.Copyable предоставляет шаблон для настройки операций копирования объектов путем определения:

  • copy - запечатанный метод, определяющий интерфейс для копирования объектов;

  • copyElement - защищенный метод, который подклассы могут переопределять для настройки операций копирования объектов для подкласса;

matlab.mixin.Copyable copy метод, вызывает copyElement способ. Подкласс настраивает операцию копирования, определяя собственную версию copyElement.

Реализация по умолчанию copyElement делает неглубокие копии всех не зависящих свойств. copyElement копирует каждое значение свойства и назначает его новому (скопированному) свойству. Если значение свойства является объектом-дескриптором, copyElement копирует дескриптор, но не базовые данные.

Для реализации различных методов копирования для различных свойств переопределите copyElement. Например, copyElement способ SpecializedCopy класс:

  • Создание нового объекта класса

  • Копирует значение Prop1 в новый объект

  • Повторная инициализация значения по умолчанию Prop2 путем добавления метки времени при создании копии

classdef SpecializedCopy < matlab.mixin.Copyable
   properties
      Prop1
      Prop2 = datestr(now)
   end
   methods(Access = protected)
      function cp = copyElement(obj)
         cp = SpecializedCopy;
         cp.Prop1 = obj.Prop1;
         cp.Prop2 = datestr(now);
      end
   end
end

Создание объекта класса и назначение значения Prop1:

a  = SpecializedCopy;
a.Prop1 = 7
a = 

  SpecializedCopy with properties:

    Prop1: 7
    Prop2: '17-Feb-2015 17:51:23'

Использовать унаследованные copy метод создания копии a:

b = copy(a)
b = 

  SpecializedCopy with properties:

    Prop1: 7
    Prop2: '17-Feb-2015 17:51:58'

Копия (объект b) имеет одинаковое значение для Prop1, но подкласс copyElement метод назначил новое значение Prop2. Обратите внимание на различные метки времени.

Копировать свойства, содержащие дескрипторы

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

Класс для поддержки копирования

Предположим, что определен класс, хранящий дескриптор в свойстве объекта. Вы хотите иметь возможность копировать объекты класса и хотите, чтобы каждая копия объекта ссылалась на новый объект-дескриптор. Настройте поведение копирования класса, выполнив следующие действия.

  • Создание подкласса matlab.mixin.Copyable.

  • Отвергнуть copyElement для управления копированием свойства, содержащего дескриптор.

  • Поскольку значение свойства является дескриптором, создайте новый объект по умолчанию того же класса.

  • Скопируйте значения свойств из исходного объекта-дескриптора в новый объект-дескриптор.

Класс HandleCopy настраивает операции копирования для свойства, содержащего объект-дескриптор. Класс ColorProp определяет объект-дескриптор для назначения Prop2:

Создайте объект и назначьте значения свойств:

a = HandleCopy;
a.Prop1 = 7;
a.Prop2 = ColorProp;

Создание копии объекта с помощью copy метод, унаследованный от matlab.mixin.Copyable:

b = copy(a);

Демонстрация того, что объекты-дескрипторы содержатся в объектах a и b независимы. Изменение значения объекта a не влияет на объект b:

a.Prop2.Color = 'red';
b.Prop2.Color
ans =

blue

HandleCopy

HandleCopy настраивает операцию копирования для объектов этого класса.

classdef HandleCopy < matlab.mixin.Copyable
   properties
      Prop1 % Shallow copy
      Prop2 % Handle copy
   end
   methods (Access = protected)
      function cp = copyElement(obj)
         % Shallow copy object
         cp = copyElement@matlab.mixin.Copyable(obj);
         % Get handle from Prop2
         hobj = obj.Prop2;
         % Create default object
         new_hobj = eval(class(hobj));
         % Add public property values from orig object
         HandleCopy.propValues(new_hobj,hobj);
         % Assign the new object to property
         cp.Prop2  = new_hobj;
      end
   end
   methods (Static)
      function propValues(newObj,orgObj)
         pl = properties(orgObj);
         for k = 1:length(pl)
            if isprop(newObj,pl{k})
               newObj.(pl{k}) = orgObj.(pl{k});
            end
         end
      end
   end
end

ColorProp

ColorProp класс определяет цвет, присваивая значение RGB Color собственность.

classdef ColorProp < handle
   properties
      Color = 'blue';
   end
end

Исключить свойства из копии

Используйте NonCopyable атрибут свойства указывает на то, что операция копирования не должна копировать определенное значение свойства. По умолчанию NonCopyable является false, указывая, что значение свойства является копируемым. Можно задать NonCopyable кому true только для свойств классов дескрипторов.

Для классов, производных от matlab.mixin.Copyable, реализация по умолчанию copyElement чтит NonCopyable атрибут. Следовательно, если свойство имеет NonCopyable атрибут имеет значение true, то copyElement не копирует значение этого свойства. Если переопределить copyElement в подклассе можно выбрать, как использовать NonCopyable атрибут.

Задайте атрибут «Не копировать»

Набор NonCopyable кому true в блоке свойств:

properties (NonCopyable)
   Prop1
end

Значения по умолчанию

Если свойство, не подлежащее копированию, имеет значение по умолчанию, назначенное в определении класса, операция копирования присваивает свойству значение по умолчанию. Например, CopiedClass присваивает значение по умолчанию Prop2.

classdef CopiedClass < matlab.mixin.Copyable
   properties (NonCopyable)
      Prop1
      Prop2 = datestr(now) % Assign current time
   end
end

Создание объекта для копирования и назначения значения Prop1:

a = CopiedClass;
a.Prop1 = 7
a = 

  CopiedClass with properties:

    Prop1: 7
    Prop2: '17-Feb-2015 15:19:34'

Копия a кому b с использованием copy метод, унаследованный от matlab.mixin.Copyable:

b = copy(a)
b = 

  CopiedClass with properties:

    Prop1: []
    Prop2: '17-Feb-2015 15:19:34'

В копии b, значение Prop1 не копируется. Значение Prop2 установлено значение по умолчанию, определяемое MATLAB ® при первой загрузке класса. Метка времени не изменяется.

Объекты с динамическими свойствами

Подклассы dynamicprops позволяет добавлять свойства к объекту класса. Когда класс является производным от dynamicprops также является подклассом matlab.mixin.Copyable, реализация по умолчанию copyElement не копирует динамические свойства. Значение по умолчанию NonCopyable является true для динамических свойств.

Реализация по умолчанию copyElement чтит значение динамического свойства NonCopyable атрибут. Если требуется разрешить копирование динамического свойства, задайте его NonCopyable атрибут для false. При копировании динамического свойства копируются значение свойства и значения атрибутов свойства.

Например, эта операция копирования копирует динамическое свойство, DynoProp, потому что его NonCopyable атрибут имеет значение false. Объект obj должен быть экземпляром класса, производного от обоих dynamicprops и matlab.mixin.Copyable:

obj = MyDynamicClass;
p = addprop(obj,'DynoProp');
p.NonCopyable = false;
obj2 = copy(obj);

См. также

Связанные темы