exponenta event banner

Назначение при неизменном значении свойства

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

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

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

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

  • Вызовите PreSet и PostSet события.

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

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

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

Связанные темы