Предотвращение зависимости от порядка инициализации свойства

Загрузка свойства элемента управления

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

Предположим, что ваш проект класса таков, что оба из следующего верны:

  • Метод набора свойств изменяет другое значение свойства.

  • Значение свойства вычисляется из других значений свойств.

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

load функционируйте устанавливает значения свойств в особом порядке. Этот порядок может отличаться от порядка, в котором вы устанавливаете свойства в сохраненном объекте. В результате загруженный объект может иметь различные значения свойств, чем объект имел, когда это было сохранено.

Restore Nondependent Properties

Если функция набора свойств изменяет значения других свойств, то задайте Dependent атрибут того свойства как true. MATLAB® не сохраняет или восстанавливает зависимые значения свойств.

Используйте независимые свойства для хранения значений, установленных зависимым свойством. Затем load функционируйте восстанавливает независимые свойства с теми же значениями, которые были сохранены. load функция не вызывает зависимый метод набора свойств, потому что нет никакого значения в сохраненном файле для того свойства.

Зависимое свойство с частным устройством хранения данных

Odometer класс избегает зависимостей порядка, когда загружаемые объекты путем управления, который свойства восстанавливаются при загрузке:

  • Units свойство зависит. Его метод набора свойств устанавливает TotalDistance свойство. Поэтому load не вызывает Units метод набора свойств.

  • Функция load восстанавливает TotalDistance к любому значению это имело когда вы сохраненный объект.

classdef Odometer
   properties(Constant)
      ConversionFactor = 1.6
   end
   properties
      TotalDistance = 0
   end
   properties(Dependent)
      Units
   end
   properties(Access=private)
      PrivateUnits = 'mi'
   end
   methods
      function unit = get.Units(obj)
         unit = obj.PrivateUnits;
      end
      function obj = set.Units(obj,newUnits)
         % validate newUnits to be a char vector
         switch(newUnits)
            case 'mi'
               if strcmp(obj.PrivateUnits,'km')
                  obj.TotalDistance = obj.TotalDistance / ...
                     obj.ConversionFactor;
                  obj.PrivateUnits = newUnits;
               end
            case 'km'
               if strcmp(obj.PrivateUnits,'mi')
                  obj.TotalDistance = obj.TotalDistance * ...
                     obj.ConversionFactor;
                  obj.PrivateUnits = newUnits;
               end
            otherwise
               error('Odometer:InvalidUnits', ...
                  'Units ''%s'' is not supported.', newUnits);
         end
      end
   end
end

Предположим, что вы создаете экземпляр Odometer и набор следующие значения свойств:

odObj = Odometer;
odObj.Units = 'km';
odObj.TotalDistance = 16;

Когда вы сохраняете объект:

  • ConversionFactor не сохранено, потому что это - Constant свойство.

  • TotalDistance сохранено.

  • Units не сохранено, потому что это - Dependent свойство.

  • PrivateUnits сохранено и обеспечивает устройство хранения данных для текущего значения Units.

Когда вы загружаете объект:

  • ConversionFactor получен из определения класса.

  • TotalDistance isloaded .

  • Units не загружается, таким образом, его метод установки не называется.

  • PrivateUnits загружается от сохраненного объекта.

Если Units свойством не был Dependent, загрузка его вызывает свой метод установки и вызывает TotalDistance свойство, которое будет установлено снова.

Значение свойства, вычисленное из других свойств

Odometer2 класс TripDistance свойство зависит только от значений двух других свойств, TotalDistance и TripMarker.

Класс избегает зависимости порядка при инициализации значений свойств во время процесса загрузки путем создания TripDistance зависимый свойства. MATLAB не сохраняет или загружает значение для TripDistance свойство, но действительно сохраняет и загружает значения для этих двух свойств, используемых, чтобы вычислить TripDistance в его свойстве получают метод.

classdef Odometer2
   properties
      TotalDistance = 0
      TripMarker = 0
   end
   properties(Dependent)
      TripDistance
   end
   methods
      function distance = get.TripDistance(obj)
         distance = obj.TotalDistance - obj.TripMarker;
      end
   end
end

Похожие темы