Проблемы могут произойти, если значения свойств зависят от порядка в который load
устанавливает значения свойств.
Предположим, что ваш проект класса таков, что оба из следующего верны:
Метод набора свойств изменяет другое значение свойства.
Значение свойства вычисляется из других значений свойств.
Затем конечное состояние объекта после изменения серии значений свойств может зависеть от порядка, в котором вы устанавливаете свойства. Эта зависимость от порядка может влиять на результат загрузки объекта.
load
функционируйте устанавливает значения свойств в особом порядке. Этот порядок может отличаться от порядка, в котором вы устанавливаете свойства в сохраненном объекте. В результате загруженный объект может иметь различные значения свойств, чем объект имел, когда это было сохранено.
Если функция набора свойств изменяет значения других свойств, то задайте 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