跳到内容

CORBA 编程/Echo/对象

来自维基教科书,开放的书籍,开放的世界

回声对象是一个简单的对象,只有一个方法。该方法接受一个字符串参数并返回该字符串,不变。

CORBA IDL 定义

[编辑 | 编辑源代码]

任何 CORBA 对象都需要在 CORBA接口定义语言 (IDL) 中定义。IDL 语法基于 C/C++,包括使用 C 预处理器。因此,我们需要通常的保护措施来防止双重包含

文件:test-echo.idl (查看纯文本下载页面浏览全部)
#ifndef  __TEST_ECHO_DEFINED
#define  __TEST_ECHO_DEFINED

接下来,我们定义一个模块名称。虽然对于这样一个小的示例来说不是严格需要的,但最好不要用类污染全局命名空间,而是使用模块。

 module Test
    {

在 CORBA IDL 中,类称为“接口”。这不要与 Ada 或 Java 中的接口混淆。CORBA 接口是类的公共部分——您可以与之交互的类部分。

    interface Echo
       {

如前所述,我们只定义了一个方法。它接受一个名为 Message 的字符串作为输入参数,并返回一个字符串作为结果。

       string
       Echo_String (
          in string Message	
          );
 
       };
    // end interface Echo
 
    };
 // end module Test
 
 #endif

Ada 规范

[编辑 | 编辑源代码]

在下载下面的规范之前,您应该尝试调用以下 PolyORB 命令。它将为您生成实现模板。

idlac -i test-echo.idl

大多数 CORBA 实现将为所选的实现语言生成规范和实现模板文件。您可以从哪些实现语言中选择取决于您的 ORB。在本例中,它是 Ada

文件:test-echo-impl.ads (查看纯文本下载页面浏览全部)
 with CORBA;
 with PortableServer;

CORBA 模块 (Test) 和类 (Echo) 被映射到 Ada 包层次结构——这是在 Ada 中进行面向对象编程的正常方式。CORBA 语言映射始终尝试将实现语言映射得尽可能接近。Echo 层次结构包含多个子包,这些子包完全生成,不需要注意。只有子包“Impl”包含我们 Echo 类的实际实现,需要编辑。

 package Test.Echo.Impl
 is

Object 类型包含我们的类可能想要存储的任何数据。但是,所有存储的数据都是私有的,实际上 CORBA 对象中的所有数据都是私有的。

    type Object
    is new
       PortableServer.Servant_Base
    with private;
 
    type Object_Ptr is access Object'Class;

Echo 函数被指定为对普通 Ada 类的普通原始操作。如果您有兴趣了解 Ada 类是如何声明的,您可以阅读 Ada 编程/面向对象

    function Echo_String (
       --  The Object itself
       Self : access Object;
       --  The string which should be echoed.
       Message : in CORBA.String)
    return
       --  The returned string - which is the same as Message
       CORBA.String;
 
 private

在这里,在包的私有部分,我们现在可以为我们的类声明数据成员。但是我们简单的回声类不需要任何数据,所以我们只声明一个“空记录”。如果您有兴趣了解它在包含数据成员的情况下会是什么样子,您可以阅读 Ada 编程/类型/记录

    type Object
    is new
        PortableServer.Servant_Base
    with null record;
 
 end Test.Echo.Impl;

Ada 实现

[编辑 | 编辑源代码]

现在我们知道了 CORBA 对象在 Ada 中的样子,我们必须实际实现该对象。实现比需要的大一点——使用 PolyORB 日志记录功能来生成诊断输出。

文件:test-echo-impl.adb (查看纯文本下载页面浏览全部)
 with PolyORB.Log;
 
 with Test.Echo.Skel;
 
 --
 --  The following packages are only initialized but not used otherwise.
 --
 pragma Warnings (Off, Test.Echo.Skel);
 
 --
 --  Test.Echo.Skel is only initialized but not used.
 --
 pragma Elaborate (Test.Echo.Skel);
 
 package body Test.Echo.Impl
 is
    --
    --  a Test Module to test the basic PolyORB functions
    --
 
 --------------------------------------------------------------------------------
 
    --
    --  Initialize logging from configuration file.
    --
    package Log is new  PolyORB.Log.Facility_Log ("test.echo");
 
 --------------------------------------------------------------------------------
 
    --
    --  Log Message when Level is at least equal to the user-requested
    --  level for Facility.
    --
    procedure Put_Line (
       Message : in Standard.String;
       Level   : in PolyORB.Log.Log_Level := PolyORB.Log.Info)
    renames
       Log.Output;
 
 --------------------------------------------------------------------------------
 
    --
    --  Echo the given string back to the client.
    --
    function Echo_String (
       --  The Object itself
       Self : access Object;
       --  The string which should be echoed.
       Message : in CORBA.String)
    return
       --  The returned string - which is the same as Message
       CORBA.String
    is
       pragma Unreferenced (Self);
    begin
       Put_Line (
          "Echoing string: « " &
          CORBA.To_Standard_String (Message) &
          " »");
       return Message;
    end Echo_String;
 
 --------------------------------------------------------------------------------
 
 end Test.Echo.Impl;
华夏公益教科书