2.9.5 デリゲーションを使用したサーバインプリメンテーション
サーバをインプリメントするための継承には一つ欠点があります。サーバクラスはPOAスケルトンクラスを継承するため,ほかの目的でインプリメンテーション継承を使用できません。それは,Javaが単一の継承だけをサポートしているからです。サーバクラスが,ほかの目的で利用できる単独の継承リンクを使用しなければならない場合,デリゲーションする必要があります。
サーバクラスがデリゲーションを使用してインプリメントされる場合,追加のコードが生成されます。
-
各インタフェースは,POAスケルトンを継承するTieクラスにマッピングされ,デリゲーションコードを提供します。
-
各インタフェースは,Tieクラスがデリゲーションしているオブジェクトの型を定義するために使用されるOperationsインタフェースにもマッピングされます。
デリゲートされたインプリメンテーションはOperationsインタフェースをインプリメントする必要があり,Tieクラスのインスタンスに格納しなければいけません。OperationインタフェースのインスタンスをTieオブジェクトに格納するのは,Tieクラスで提供されるコンストラクタです。デリゲーションの使用例をコードサンプル2-25に示します。
- コードサンプル2-25 デリゲーションを使用したJavaでのサーバインプリメンテーション
/*From Bank.idl:*/ module Bank { interface AccountManager { Account open(in string name); }; }; //Generated java package Bank; public interface AccountManagerOperations { public Example.Account open(java.lang.String name); } //Generated java package Bank; public class AccountManagerPOATie extends AccountManagerPOA { public AccountManagerPOATie( final Bank.AccountManagerOperations _delegate) {...} public AccountManagerPOATie( final Bank.AccountManagerOperations _delegate, final org.omg.PortableServer.POA _poa){...} public Bank.AccountManagerOperations _delegate ( ){...} public void _delegate( final Bank.AccountManagerOperations delegate) {...} public org.omg.PortableServer.POA _default_POA( ){...} public float open( ){...} } //Linking an implementation to the ORB : //classAccountImpl implements AccountManager Operations public class Server { public static main(String args){ //... AccountManagerPOAtie managerServant = new AccountManagerPOATie( new AccountManagerImpl( )); //... }