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