2013-07-04 4 views
1

У меня есть простой интерфейс 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); 
} 

, но это делает OmniORB кору Syntax error in operation parameters.

Итак, чтобы повторить вопрос в заголовке: есть ли способ указать значение по умолчанию для аргумента операции вообще в моем IDL? И в этом конкретном случае, как бы указать значение по умолчанию false для flag?

Благодарим за помощь!

ответ

3

Нет. IDL не поддерживает аргументы по умолчанию, вероятно, потому, что некоторые целевые языки не поддерживают эту функцию.

+0

В IDL ничего не поддерживается. У нас есть теперь аннотации IDL, поэтому поставщик может использовать это как способ добавить такую ​​поддержку для языков, которые ее поддерживают. –

+0

@JohnnyWillemsen, где я могу прочитать об аннотациях IDL? Это последняя спецификация CORBA? –

+0

Это часть DDS X-Types и будет интегрирована в IDL4 (когда мы найдем время для работы над этим), см. Http://www.omg.org/spec/DDS-XTypes/Current –

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; 
} 
Смежные вопросы