Создание Прослушивателя с loadobjПредположим, что вы создаете прослушиватель свойства и хотите смочь сохранить и восстановить источник события и прослушиватель. Один подход должен создать прослушиватель из метода loadobj.
Класс BankAccount хранит баланс счета и состояние учетной записи. Прослушиватель PostSet, присоединенный к свойству AccountBalance, управляет состоянием учетной записи.
Когда значение свойства AccountBalance изменяется, обратный вызов прослушивателя определяет состояние учетной записи. Важные моменты включают:
Класс BankAccount задает свойство AccountManagerListener содержать указатель прослушивателя. Это свойство позволяет методу loadobj создать прослушиватель и возвратить ссылку на него в объекте, который загружается в рабочую область.
Свойством AccountManagerListener является Transient, потому что нет никакой потребности сохранить указатель прослушивателя объектом BankAccount. Создайте прослушиватель, который присоединен к новому объекту BankAccount, созданному во время процесса загрузки.
Прослушиватель AccountBalance устанавливает AccountStatus.
Только класс AccountManager может получить доступ к свойству AccountStatus.
classdef BankAccount < handle properties (SetObservable, AbortSet) AccountBalance end properties (Transient) AccountManagerListener end properties (Access = ?AccountManager) AccountStatus end methods function obj = BankAccount(initialBalance) obj.AccountBalance = initialBalance; obj.AccountStatus = 'New Account'; obj.AccountManagerListener = AccountManager.addAccount(obj); end end methods (Static) function obj = loadobj(obj) if isstruct(obj) % Handle error initialBalance = obj.AccountBalance; obj = BankAccount(initialBalance); else obj.AccountManagerListener = AccountManager.addAccount(obj); end end end end
Примите, что класс AccountManager предоставляет услуги для различных типов учетных записей. Для класса BankAccount класс AccountManager задает два метода Static:
assignStatus — Обратный вызов для свойства AccountBalance прослушиватель PostSet. Этот метод определяет значение свойства BankAccount AccountStatus.
addAccount — Создает свойство AccountBalance прослушиватель PostSet. Конструктор BankAccount и методы loadobj вызывают этот метод.
classdef AccountManager methods (Static) function assignStatus(BA,~) if BA.AccountBalance < 0 && BA.AccountBalance >= -100 BA.AccountStatus = 'overdrawn'; elseif BA.AccountBalance < -100 BA.AccountStatus = 'frozen'; else BA.AccountStatus = 'open'; end end function lh = addAccount(BA) lh = addlistener(BA,'AccountBalance','PostSet', ... @(src,evt)AccountManager.assignStatus(BA)); end end end
Создайте экземпляр класса BankAccount.
ba = BankAccount(100)
ba =
BankAccount with properties:
AccountBalance: 100
AccountManagerListener: [1x1 event.proplistener]
AccountStatus: 'New Account'Теперь установите значение учетной записи, чтобы подтвердить, что AccountManager устанавливает AccountStatus соответственно:
ba.AccountBalance = -10; ba.AccountStatus
ans = overdrawn