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