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