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