Создание Прослушивателя с 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