Main Content

リスナーの復元

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 メソッドを定義します。

  • assignStatusAccountBalance プロパティの PostSet リスナーに対するコールバック。このメソッドは BankAccountAccountStatus プロパティの値を判定します。

  • addAccountAccountBalance プロパティの 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'

アカウントの値を設定して、AccountManagerAccountStatus を適切に設定することを確認します。

ba.AccountBalance = -10;
ba.AccountStatus
ans =

overdrawn

関連するトピック