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

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

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

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

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

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

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

Чтобы сравнить значения, MATLAB должен получить текущее значение свойства. Получение причин текущего значения, свойство получает метод (добраться. 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

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

Похожие темы