EODelegateUsage

2007/03/30 (Fri) 22:07:46 JST

デリゲートのセット

デリゲートをセットする方法はクラスによって異なりますが、多くのクラスではsetDelegateもしくはsetDefaultDelegateメソッドでセットできます。 次のクラスのかっこ内がデリゲートをセットするメソッドです。

多くのデリゲートメソッドは「クラス名.?ClassDelegate」もしくは「クラス名.Delegate」インターフェースとして定義されており、setClassDelegateとsetDelegateでデリゲートするオブジェクトをセットします。 Delegateのメソッドはセットしたインスタンスのみの挙動を変更しますが、?ClassDelegateのメソッドはクラスのインスタンスすべての挙動を変更します。

アダプタ・データベースレベルのデリゲートが用意されているクラス(EOAdaptor, ?EOAdaptorChannel, ?EOAdaptorContext, EODatabaseContext)のうち、EOAdaptorを除くクラスは必要に応じて動的に生成されるので、アプリケーション起動時にデリゲートをセットすることができません。 ただしその代わりにデフォルトデリゲート(defaultDelegate)が用意されており、上記のオブジェクトの生成時にデリゲートをセットしてくれます。 (?EOAdaptorContextのデフォルトデリゲートは?EOAdaptorChannelにもセットされます)

個別にデリゲートをセットする場合は、EODatabaseContextならEOObjectStoreCoordinatorの cooperatingObjectStores や objectStoreForFetchSpecification などでオブジェクトを取得することができます。 このEODatabaseContextをたどると?EOAdaptorChannelにデリゲートもセットできます。

次のコードはEODatabaseContext?EOAdaptorChannelにデリゲートをセットする例です。

// それぞれのデリゲートするオブジェクト
DatabaseContextDelegate dcd = new DatabaseContextDelegate();
AdaptorChannelDelegate achd = new AdaptorChannelDelegate();

// EODatabaseContextの配列を取得する
Enumeration e =
   EOObjectStoreCoordinator.defaultCoordinator()
                           .cooperatingObjectStores()
                           .objectEnumerator();
while (e.hasMoreElements()) {
   // EODatabaseContextにデリゲートをセット
   EODatabaseContext dbCxt = (EODatabaseContext)e.nextElement();
   dbCxt.setDelegate(dcd);

   // EOAdaptorChannelの配列を取得する
   Enumeration e2 = 
       dbCxt.adaptorContext().channels().objectEnumerator();
   while (e2.hasMoreElements()) {
       // EOAdaptorChannelにデリゲートをセット
       ((EOAdaptorChannel)e2.nextElement()).setDelegate(achd);
   }
}

Inverse Pages: WebObjects基礎研究室