CORBA:有没有办法在IDL中为操作参数指定默认值?

时间:2013-07-04 13:23:59

标签: corba idl omniorb

我有一个简单的CORBA接口,操作简单,如本IDL提取所示:

interface MtInterface
{
    void myOperation(in string id);
}

我需要在myOperation中添加一个布尔参数。所以我所做的就是将我的IDL改为:

interface MtInterface
{
    void myOperation(in string id, in boolean flag);
}

现在这一切都很好,除了这个界面在很多地方使用,我想通过给{{1}的默认值false来避免修改所有的调用。所以我的第一次尝试看起来像:

flag

但这会使omniORB与interface MtInterface { void myOperation(in string id, in boolean flag = false); } 一起吠叫。

所以重复标题中的问题:是否有办法在我的IDL中为操作参数指定默认值?在这种特殊情况下,我如何为Syntax error in operation parameters指定默认值false

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

没有。 IDL不支持默认参数,可能是因为某些目标语言不支持该功能。

答案 1 :(得分:0)

对你有用的是union作为你的论点。一个变体有两个参数,一个只有一个参数。您仍然需要手动编码默认值,例如通过让单个参数版本调用两个参数版本,并将第二个参数设置为您想要的默认值。有了这个IDL:

interface MtInterface
{
   struct myShortArg
   {
      string    id;
   };

   struct myLongArg
   {
      string    id;
      boolean   flag;
   }

   union myArgument switch (unsigned short)
   {
      case 1: myShortArg   shortArg;
      case 2: myLongArg    longArg;
   }

   void myOperation(in myArgument);
}

在您的实现中,您需要检查union的实际内容是什么(详细信息将取决于语言绑定)。您可以按照以下方式进行:

switch(typeof(myArgument))
{
    case class(myLongArg):    myOperationImpl(myArgument.id, myArgument.flag);
                              break;

    case class(myShortArg):   myOperationImpl(myArgument.id, false);
                              break;
}