CORBA 编程/Echo/对象
回声对象是一个简单的对象,只有一个方法。该方法接受一个字符串参数并返回该字符串,不变。
任何 CORBA 对象都需要在 CORBA 的 接口定义语言 (IDL) 中定义。IDL 语法基于 C/C++,包括使用 C 预处理器。因此,我们需要通常的保护措施来防止双重包含
#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
在下载下面的规范之前,您应该尝试调用以下 PolyORB 命令。它将为您生成实现模板。
idlac -i test-echo.idl
大多数 CORBA 实现将为所选的实现语言生成规范和实现模板文件。您可以从哪些实现语言中选择取决于您的 ORB。在本例中,它是 Ada。
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;
现在我们知道了 CORBA 对象在 Ada 中的样子,我们必须实际实现该对象。实现比需要的大一点——使用 PolyORB 日志记录功能来生成诊断输出。
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;