Borland(R) Enterprise Server VisiBroker(R) デベロッパーズガイド

[目次][索引][前へ][次へ]

25.2.4 Factoryクラスのインプリメント

これでインプリメンテーションクラスを生成したので,valuetypeのFactoryをインプリメントします。

次に示すサンプルでは,生成されたPoint_initクラスにはIDLで宣言されたcreateメソッドがあります。このクラスはCORBA::ValueFactoryBase(C++)またはorg.omg.CORBA.portable.ValueFactory(Java)を継承します。コードサンプル25-3および25-4で示すようにPointDefaultFactoryクラスはPointValueFactoryをインプリメントします。

コードサンプル25-3 Factoryクラスのインプリメント(C++)
 
class PointFactory: public CORBA::ValueFactoryBase {
   public:
      PointFactory(){}
      virtual ~PointFactory(){}
      CORBA::ValueBase* create_for_unmarshal() {
         return new PointImpl();
      }
};
 

C++の場合,Point_initには,パブリックメソッドであるcreate_for_unmarshalがあり,これはMap_c.hhの純仮想メソッドとして出力されます。ユーザはPoint_initからクラスを派生させ,create_for_unmarshalメソッドをインプリメントしてFactoryクラスを生成する必要があります。IDLファイルをコンパイルする場合,IDLファイル用のスケルトンクラスを生成しません。

コードサンプル25-4 Factoryクラスのインプリメント(Java)
 
public class PointDefaultFactory implements
                                       PointValueFactory {
   public java.io.Serializable read_value (
                  org.omg.CORBA.portable.InputStream is) {
      java.io.Serializable val =
          new PointImpl(); // Called the implementation class
      // create and initialize value
      val = ((org.omg.CORBA_2_3.portable.InputStream)is).
                                          read_value(val);
      return val;
   }
   // It is up to the user to implement the valuetype
   // however they want:
   public Point create (int x,
         int y,
         java.lang.String z) {
      //IMPLEMENT:
      return null;
   }
}
 

新しいvaluetypeを作成するためにPointImpl()が呼び出されます。新しいvaluetypeは,read_valueによってInputStreamから読み込まれます。

注(Javaの場合)
ユーザはread_valueを呼び出す必要があります。これを呼び出さないと,ファクトリが動作しないで,ほかのどのメソッドも呼び出せません。