プログラム例 4: 実装の継承を行う Hello World


通常、サーバントクラスは、idltojava コンパイラにより生成される ImplBase クラスを継承しなければなりません。サーバントクラスにほかの Java クラスの機能を継承させたい場合、この制限が問題になります。プログラミング言語 Java ではスーパークラスは 1 つしか指定できませんが、idltojava コンパイラにより生成される ImplBase クラスがこの位置を占めてしまいます。

このプログラム例 4 では、サーバントクラスに任意の Java クラスを継承させる方法を説明します。このプログラム例では、HelloServant クラスは、そのすべての実装を HelloBasic という Java クラスから継承しています。実行時、HelloServant に対するメソッド要求は、idltojava により生成された別のクラスに委譲されます。

プログラム例 4 は、実装の継承に関する拡張が行われている点を除いて、プログラム例 1 と同じです。このページでは、拡張部分のコードについてだけ説明します。

このページでは、次の内容について説明します。

このプログラム例のコンパイル方法と実行方法については、「Hello World の構築方法と実行方法」を参照してください。

インタフェース定義 (Hello.idl)

module HelloApp
{
    interface Hello
    {
        string sayHello();
    };
};

この IDL インタフェースは、次のコマンドでコンパイルします。

        idltojava -ftie  Hello.idl
これにより、HelloApp サブディレクトリに次の 2 つのファイルが生成されます。
_HelloOperations.java
サーバントクラスでは、このインタフェースを実装します。
_HelloTie.java
このクラスはスケルトンとして機能し、ORB から呼び出しを受け取って、実際に処理を行うサーバントにそれを委譲します。

サーバの実装 (HelloServer.java)

// Copyright and License 

import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
 

class HelloBasic 
{
    public String sayHello()
    {
        return "\nHello world !!\n";
    }
}

class HelloServant extends HelloBasic implements _HelloOperations
{
}

 
public class HelloServer {
 
    public static void main(String args[])
    {
	try{
	    // create and initialize the ORB
	    ORB orb = ORB.init(args, null);
 
	    // create servant and register it with the ORB
	    HelloServant servant = new HelloServant();
	    Hello helloRef = new _HelloTie(servant);
	    orb.connect(helloRef);
 
	    // get the root naming context
	    org.omg.CORBA.Object objRef = 
		orb.resolve_initial_references("NameService");
	    NamingContext ncRef = NamingContextHelper.narrow(objRef);
 
	    // bind the Object Reference in Naming
	    NameComponent nc = new NameComponent("Hello", "");
	    NameComponent path[] = {nc};
	    ncRef.rebind(path, helloRef);
 
	    // wait for invocations from clients
            java.lang.Object sync = new java.lang.Object();
            synchronized (sync) {
                sync.wait();
            }
 
	} catch (Exception e) {
	    System.err.println("ERROR: " + e);
	    e.printStackTrace(System.out);
	}
    }
}
 

クライアントの実装 (HelloClient.java)

// Copyright and License 
 
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
 
public class HelloClient 
{
    public static void main(String args[])
    {
	try{
	    // create and initialize the ORB
	    ORB orb = ORB.init(args, null);
 
            // get the root naming context
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
            NamingContext ncRef = NamingContextHelper.narrow(objRef);

            // resolve the Object Reference in Naming
            NameComponent nc = new NameComponent("Hello", "");
            NameComponent path[] = {nc};
            Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
 
	    // call the Hello server object and print results
	    String hello = helloRef.sayHello();
	    System.out.println(hello);
 
	} catch (Exception e) {
	    System.out.println("ERROR : " + e) ;
	    e.printStackTrace(System.out);
	}
    }
}

 

Hello World の構築方法と実行方法

以下の説明では、Java IDL ネームサーバ用にポート 1050 を使用できることを前提としています。必要であれば別のポートに変更してください。なお、1024 以下のポートを使用する場合は、UNIX マシンであればスーパーユーザの権限が、Windows95 および NT であれば管理者の権限が必要です。また、以下の説明ではパス名でスラッシュ (/) を使用していますが、Windows95 および NT ではバックスラッシュ (\) に置き換える必要があります。


ホーム

Copyright © 1995-98 Sun Microsystems, Inc. All Rights Reserved.