Когда вы задаете значение свойства, MATLAB® запускает свойство PreSet
и PostSet
events, вызывает метод набора свойств (если он определен) и устанавливает значение свойства. Эти действия происходят, даже когда текущее значение свойства совпадает с новым значением.
Можно предотвратить эти действия, установив AbortSet
свойства атрибут к
true
. Когда AbortSet
включено, MATLAB сравнивает текущее значение свойства с новым значением, назначенным свойству. Если новое значение совпадает с текущим значением, MATLAB не:
Установите значение свойства.
Срабатывание PreSet
и PostSet
события.
Вызовите метод набора свойств, если он существует.
Чтобы сравнить значения, MATLAB должен получить текущее значение свойства. Получение текущего значения приводит к тому, что свойство get method (get.
) для выполнения, если он существует. Любые ошибки, возникающие при вызове метода get свойства, видны пользователю, даже если MATLAB не меняет текущее значение.Property
MATLAB использует isequal
функция для определения, совпадает ли текущее значение свойства с новым значением. Чтобы определить, вычисляются ли определенные значения как равные при использовании AbortSet
атрибут, см. isequal
поиск по функциям или любая isequal
метод перегружен для класса значения свойства.
Использование AbortSet
атрибут несет некоторые накладные расходы при сравнении текущих и новых значений свойств. Использование AbortSet
атрибут может замедлить все назначения свойств, поскольку текущее и присвоенное значения всегда сравниваются перед выполнением присвоения. The AbortSet
атрибут наиболее полезен, когда:
Вы хотите предотвратить уведомление о PreSet
и PostSet
события и выполнение коллбэков прослушивателя, когда значение свойства не меняется.
Стоимость настройки значения свойства больше, чем стоимость сравнения текущего значения свойства с назначенным значением, и вы готовы понести затраты сравнения со всеми присвоениями свойству.
Следующий пример показывает, как AbortSet
атрибут работает. The AbortTheSet
класс задает свойство, PropOne
, который имеет прослушиватели для PreGet
, PreSet
, PostGet
, и PostSet
события и включает AbortSet
атрибут.
Примечание
Чтобы использовать этот класс, сохраните AbortTheSet
класс в файле с таким же именем в папке на пути MATLAB.
classdef AbortTheSet < handle properties (SetObservable, GetObservable, AbortSet) PropOne = 7 end methods function obj = AbortTheSet addlistener(obj,'PropOne','PreGet',@obj.getPrePropEvt); addlistener(obj,'PropOne','PreSet',@obj.setPrePropEvt); addlistener(obj,'PropOne','PostGet',@obj.getPostPropEvt); addlistener(obj,'PropOne','PostSet',@obj.setPostPropEvt); end function propval = get.PropOne(obj) disp('get.PropOne called') propval = obj.PropOne; end function set.PropOne(obj,val) disp('set.PropOne called') obj.PropOne = val; end function getPrePropEvt(obj,src,evnt) disp ('Pre-get event triggered') % ... end function setPrePropEvt(obj,src,evnt) disp ('Pre-set event triggered') % ... end function getPostPropEvt(obj,src,evnt) disp ('Post-get event triggered') % ... end function setPostPropEvt(obj,src,evnt) disp ('Post-set event triggered') % ... end function disp(obj) % Overload disp to avoid accessing property disp (class(obj)) end end end
Класс задает начальное значение 7
для PropOne
свойство. Поэтому, если вы создаете объект и присваиваете значение свойства 7
, нет необходимости запускать PreSet
событие. Однако getPropOne
вызывается метод, чтобы получить текущее значение свойства для сравнения с назначенной переменной.
obj = AbortTheSet; obj.PropOne = 7;
get.PropOne called
Если вы задаете значение, отличное от 7
MATLAB выполняет следующие шаги:
Получает текущее значение свойства
Запускает PreSet
событие
Устанавливает свойство на назначенное значение
Запускает PostSet
событие
obj = AbortTheSet; obj.PropOne = 9;
get.PropOne called Pre-set event triggered set.PropOne called Post-set event triggered
Если вы запрашиваете значение свойства, PreGet
и PostGet
инициируются события.
obj.PropOne
Pre-get event triggered get.PropOne called Post-get event triggered ans = 9
Когда классы используют валидацию свойств и AbortSet
в определении свойства MATLAB оценивает валидацию свойства перед сравнением текущего значения со значением, которому присваивается. Для примера измените AbortTheSet
класс, чтобы добавить ограничение по размеру 1 на 3 к PropOne
свойство.
classdef AbortTheSet < handle properties (SetObservable, GetObservable, AbortSet) % Restrict size to 1-by-3 % *********************** PropOne (1,3) = [7 7 7] % *********************** end methods function obj = AbortTheSet addlistener(obj,'PropOne','PreGet',@obj.getPrePropEvt); addlistener(obj,'PropOne','PreSet',@obj.setPrePropEvt); addlistener(obj,'PropOne','PostGet',@obj.getPostPropEvt); addlistener(obj,'PropOne','PostSet',@obj.setPostPropEvt); end function propval = get.PropOne(obj) disp('get.PropOne called') propval = obj.PropOne; end function set.PropOne(obj,val) disp('set.PropOne called') obj.PropOne = val; end function getPrePropEvt(obj,src,evnt) disp ('Pre-get event triggered') % ... end function setPrePropEvt(obj,src,evnt) disp ('Pre-set event triggered') % ... end function getPostPropEvt(obj,src,evnt) disp ('Post-get event triggered') % ... end function setPostPropEvt(obj,src,evnt) disp ('Post-set event triggered') % ... end function disp(obj) % Overload disp to avoid accessing property disp (class(obj)) end end end
Поскольку MATLAB применяет скалярное расширение, чтобы удовлетворить ограничению размера, следующее назначение не запускает PreSet
или PostSet
события.
obj = AbortTheSet; obj.PropOne = 7;
get.PropOne called
obj.PropOne
Pre-get event triggered get.PropOne called Post-get event triggered ans = 7 7 7
Для получения информации о валидации свойств см. Раздел «Валидация значений свойств».