Когда вы задаете значение свойства, 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
Если вы задаете значение, отличное от 7MATLAB выполняет следующие шаги:
Получает текущее значение свойства
Запускает 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Для получения информации о валидации свойств см. Раздел «Валидация значений свойств».