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

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

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

  • 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

Похожие темы