CORBA:CORBA IDL类型可以是另一个的属性吗?

时间:2010-08-23 10:29:00

标签: interface object corba idl

在开始使用CORBA之前,我想了解一些事情。

对我来说,你可以使用IDL类型作为另一个属性,然后将该属性的方法暴露给客户端应用程序(使用“。”),这似乎很直观。

但这可能吗?

例如(原谅我的坏IDL):

interface Car{ 
      attribute BrakePedal brakePedal; 
      //... 
}



//then.. (place above) 

interface BrakePedal{ 
      void press(); 
      //... 
} 

//... 

然后在客户端应用中,您可以执行:myCar.brakePedal.press();

如果你不能做这样的多层次,CORBA看起来会很糟糕 对象接口。毕竟,现实世界的物体是多层次的,对吧?所以可以 如果这肯定有效,有人会放心并确认(或尝试,如果你已经设置了CORBA)?没有IDL文档在示例中明确地显示了这一点,这就是我担心的原因。谢谢!

2 个答案:

答案 0 :(得分:1)

声明属性在逻辑上等同于声明一对存取器函数,一个用于读取属性的值,另一个用于写入属性(您还可以具有readonly属性,在这种情况下,您只能获得读取功能)。

它确实出现在CORBA规范中。您可以将接口名称作为属性名称。我尝试将这样的IDL提供给omniORB的IDL到C ++转换器,并且它没有拒绝它。所以我认为这是允许的。

但是,我真的不确定你是否愿意在实践中这样做。大多数CORBA专家建议,如果要使用属性,则只使用readonly属性。对于这样的事情,我只会声明我自己的函数返回一个接口。

请注意,无论如何,您无法在C ++映射中真正执行所需的语法; e.g。

server->brakePedal()->press();   // major resource leak here

brakePedal()是属性访问器函数,它返回CORBA对象引用。如果您立即在其上调用press(),则会泄漏对象引用。

要做到这一点而不泄漏,你必须做这样的事情:

BrakePedal_var brakePedal(server->brakePedal());
brakePedal->press();

您无法使用C ++映射(也许您可以在Python映射中)从此场景中的属性获取您想要的符号方便性。因此,我一般不喜欢属性,我只是使用常规函数来返回BrakePedal接口。

答案 1 :(得分:0)

您不了解分布式对象的重要内容:远程对象(无论是使用CORBA,RMI,.NET远程处理还是Web服务实现)与本地对象不同。对CORBA对象的调用昂贵,速度慢,并且可能由于网络问题而失败。 object.attribute.method()语法会让人很难看到在那一行上执行了两个不同的远程调用,并且很难处理可能发生的任何故障。