Когда вы устанавливаете значение свойства, MATLAB® инициировал события свойства PreSet
и PostSet
, вызывает метод набора свойств (если вы заданы), и устанавливает значение свойства. Эти действия происходят, даже когда текущее значение свойства совпадает с новым значением.
Можно предотвратить эти действия путем установки атрибута AbortSet
свойства на true
. Когда AbortSet
включен, MATLAB сравнивает текущее значение свойства с новым значением, присваиваемым свойству. Если новое значение совпадает с текущим значением, MATLAB не делает:
Установите значение свойства.
Инициируйте события PreSet
и PostSet
.
Вызовите метод набора свойств, если вы существуете.
Чтобы сравнить значения, MATLAB должен получить текущее значение свойства. Получение причин текущего значения, которые свойство заставляет метод (
) выполнять, если вы существуете. Любые ошибки, которые происходят при вызове свойства, добираются, метод видимы пользователю, даже если MATLAB не изменяет текущее значение.get.Property
MATLAB использует функцию isequal
, чтобы определить, совпадает ли текущее значение свойства с новым значением. Чтобы определить, оценивают ли определенные значения как равные при использовании атрибута AbortSet
, смотрите поиск по функциям isequal
или любой метод isequal
, перегруженный для класса значения свойства.
Использование атрибута AbortSet
действительно подвергается немного служебным по сравнению с текущими и новыми значениями свойств. Используя AbortSet
атрибут может замедлить все присвоения свойства, потому что текущее и присвоенное значение всегда сравнивается, прежде чем присвоение сделано. Атрибут AbortSet
является самым полезным когда:
Вы хотите предотвратить уведомление о событиях PreSet
и PostSet
и выполнение коллбэков прослушивателя, когда значение свойства не изменяется.
Стоимость установки значения свойства больше, чем стоимость сравнения текущего значения свойства со значением, присваиваемым, и вы готовы понести расходы сравнения со всеми присвоениями на свойство.
Следующий пример показывает, как атрибут AbortSet
работает. Класс 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
Для получения информации о валидации свойства см. Проверку значений свойств.