1

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

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

但这可能吗?

例如(请原谅我糟糕的 IDL):

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



//then.. (place above) 

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

//... 

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

如果你不能做这些多层次的对象接口,CORBA 会显得很糟糕。毕竟,现实世界的对象是多层次的,对吧?那么有人可以让我放心并确认(或尝试,如果您已经设置了 CORBA)这是否确实有效?IDL 文档都没有在示例中明确显示这一点,这就是我担心的原因。谢谢!

4

2 回答 2

1

声明一个属性在逻辑上等同于声明一对访问函数,一个读取属性的值,一个写入它(你也可以有readonly属性,在这种情况下你只会得到读取函数)。

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

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

请注意,无论如何您都无法在 C++ 映射中执行您想要的语法;例如

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

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

要做到这一点而不会泄漏,您必须执行以下操作:

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

在这种情况下,使用 C++ 映射(也许您可以在 Python 映射中),您根本无法从属性中获得所需的符号便利。正因为如此,以及我一般不喜欢属性,我只使用一个常规函数来返回 BrakePedal 接口。

于 2010-08-26T13:59:56.740 回答
0

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

于 2010-08-25T16:37:19.383 回答