CORBA: есть ли способ указать значение по умолчанию для аргумента операции в IDL?
У меня есть простой интерфейс CORBA с простой операцией, как показано в этом фрагменте IDL:
interface MtInterface
{
void myOperation(in string id);
}
Мне нужно добавить логический аргумент в myOperation. Поэтому все, что я делаю, это меняю IDL на:
interface MtInterface
{
void myOperation(in string id, in boolean flag);
}
Теперь это все хорошо, за исключением того, что этот интерфейс используется во многих местах, и я хотел бы избежать необходимости изменять все вызовы, задав значение по умолчанию: false
в flag
так что моя первая попытка выглядит так:
interface MtInterface
{
void myOperation(in string id, in boolean flag = false);
}
но это заставляет омниорба лаять Syntax error in operation parameters
,
Итак, чтобы повторить вопрос в заголовке: есть ли способ указать значение по умолчанию для аргумента операции в целом в моем IDL? И в этом конкретном случае, как бы я указать значение по умолчанию false
за flag
?
Спасибо за вашу помощь!
2 ответа
Нет. 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;
}