我有一个简单的CORBA接口,它有一个如IDL摘录所示的简单操作:
interface MtInterface
{
void myOperation(in string id);
}
我需要在myOperation中添加一个布尔参数。所以我所做的就是将IDL更改为:
interface MtInterface
{
void myOperation(in string id, in boolean flag);
}
现在一切都很好,除了这个接口在很多地方都使用,我想通过给flag
一个默认值false
来避免修改所有调用,所以我的第一次尝试看起来像:
interface MtInterface
{
void myOperation(in string id, in boolean flag = false);
}
但这使得omniORB用CCD_ 3吠叫。
因此,重复标题中的问题:有没有一种方法可以在我的IDL中为操作参数指定默认值?在这种特殊情况下,如何为flag
指定默认值false
?
谢谢你的帮助!
否。IDL不支持默认参数,可能是因为某些目标语言不支持该特性。
对您有用的是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;
}