Присвоение, когда значение свойства неизменно

AbortSet, когда значение не изменяется

Когда вы устанавливаете значение свойства, MATLAB® инициировал события свойства PreSet и PostSet, вызывает метод набора свойств (если вы заданы), и устанавливает значение свойства. Эти действия происходят, даже когда текущее значение свойства совпадает с новым значением.

Можно предотвратить эти действия путем установки атрибута AbortSet свойства на true. Когда AbortSet включен, MATLAB сравнивает текущее значение свойства с новым значением, присваиваемым свойству. Если новое значение совпадает с текущим значением, MATLAB не делает:

  • Установите значение свойства.

  • Инициируйте события PreSet и PostSet.

  • Вызовите метод набора свойств, если вы существуете.

Чтобы сравнить значения, MATLAB должен получить текущее значение свойства. Получение причин текущего значения, которые свойство заставляет метод (get.Property) выполнять, если вы существуете. Любые ошибки, которые происходят при вызове свойства, добираются, метод видимы пользователю, даже если MATLAB не изменяет текущее значение.

Как MATLAB сравнивает значения

MATLAB использует функцию isequal, чтобы определить, совпадает ли текущее значение свойства с новым значением. Чтобы определить, оценивают ли определенные значения как равные при использовании атрибута AbortSet, смотрите поиск по функциям isequal или любой метод isequal, перегруженный для класса значения свойства.

Когда использовать AbortSet

Использование атрибута AbortSet действительно подвергается немного служебным по сравнению с текущими и новыми значениями свойств. Используя AbortSet атрибут может замедлить все присвоения свойства, потому что текущее и присвоенное значение всегда сравнивается, прежде чем присвоение сделано. Атрибут AbortSet является самым полезным когда:

  • Вы хотите предотвратить уведомление о событиях PreSet и PostSet и выполнение коллбэков прослушивателя, когда значение свойства не изменяется.

  • Стоимость установки значения свойства больше, чем стоимость сравнения текущего значения свойства со значением, присваиваемым, и вы готовы понести расходы сравнения со всеми присвоениями на свойство.

Реализация AbortSet

Следующий пример показывает, как атрибут 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 с валидацией свойства

Когда классы используют валидацию свойства и 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

Для получения информации о валидации свойства см. Проверку значений свойств.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте