1

我有一个简单的 CORBA 界面和一个简单的操作,如 IDL 摘录所示:

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

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

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

现在这一切都很好,除了这个接口在很多地方使用,我想通过给默认值 to 来避免修改所有调用falseflag所以我的第一次尝试看起来像:

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

但这使omniORB 吠叫Syntax error in operation parameters

所以重复标题中的问题:有没有办法在我的 IDL 中为操作参数指定默认值?在这种特殊情况下,我将如何指定 for 的默认falseflag

谢谢你的帮助!

4

2 回答 2

3

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

于 2013-07-04T18:07:14.570 回答
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);
}

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

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

    case class(myShortArg):   myOperationImpl(myArgument.id, false);
                              break;
}
于 2017-08-28T14:41:35.833 回答