リスナーの復元
loadobj
によるリスナーの作成
プロパティ リスナーを作成し、イベント ソースとリスナーを保存して復元できるようにするとします。1 つの方法は、リスナーを loadobj
メソッドから作成するやり方です。
過渡的プロパティを使用したリスナーの読み込み
BankAccount
クラスは預金残高と口座の状態を格納します。AccountBalance
プロパティに付加された PostSet
リスナーが口座の状態を制御します。
AccountBalance
プロパティの値が変わると、リスナー コールバックが口座の状態を判断します。重要な点として以下が挙げられます。
BankAccount
クラスは、リスナー ハンドルが含まれるようにAccountManagerListener
プロパティを定義します。このプロパティにより、loadobj
メソッドがリスナーを作成し、ワークスペースに読み込まれるオブジェクトにそのリスナーへの参照を返すことが可能になります。リスナー ハンドルを
BankAccount
オブジェクトと共に保管する必要はないため、AccountManagerListener
プロパティはTransient
です。読み込みプロセスで作成された新しい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
クラスは 2 つの 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 および AccountManager クラスの使用
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