CORBA:CORBA IDL 类型可以是另一个属性吗?
Posted
技术标签:
【中文标题】CORBA:CORBA IDL 类型可以是另一个属性吗?【英文标题】:CORBA: Can a CORBA IDL type be an attribute of another? 【发布时间】:2010-08-23 10:28:59 【问题描述】:在我开始使用 CORBA 之前,我想知道一些事情。
在我看来很直观,您可以使用 IDL 类型作为另一个类型的属性,然后该属性的方法也会暴露给客户端应用程序(使用“.”)。
但这可能吗?
例如(对不起,我的 IDL 不好):
interface Car
attribute BrakePedal brakePedal;
//...
//then.. (place above)
interface BrakePedal
void press();
//...
//...
然后在客户端应用中,你可以这样做:myCar.brakePedal.press();
如果你不能做这些多层次的事情,CORBA 会显得很糟糕 对象接口。毕竟,现实世界的对象是多层次的,对吧?所以可以 有人让我放心并确认(或尝试,如果您已经设置了 CORBA)这是否确实有效? IDL 文档都没有在示例中明确显示这一点,这就是我担心的原因。谢谢!
【问题讨论】:
【参考方案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 接口。
【讨论】:
我认为您只是不了解属性。属性是函数的简写。在这种情况下,您正在调用“读取”函数。第二级调用发生在客户端。当您进行属性“读取”调用时,服务器完全不知道您将这样做,因此无法“优化”它。它不知道您将对该对象引用做什么。不,我认为我们不会看到新的主要版本的 CORBA。它目前仅用于少数专门的利基应用程序和遗留应用程序。【参考方案2】:您不了解分布式对象的一些重要内容:远程对象(无论是使用 CORBA、RMI、.NET 远程处理还是 Web 服务实现)与本地对象不同。对 CORBA 对象的调用成本高、速度慢,并且可能由于网络问题而失败。 object.attribute.method() 语法会让人很难看到在那一行上执行了两个不同的远程调用,并且很难处理可能发生的任何故障。
【讨论】:
哦,很有趣,谢谢!除了我打算纯粹在本地系统上使用它(新硬件设备与想要在同一台台式计算机上支持它的第 3 方应用程序交互,无论平台/语言如何)。还是绝对不行吗?? (请原谅我在阅读您的帖子时很愚蠢,但我不确定您是说这在网络中是不可取的,还是在 IDL 技术上实际上是不可能的)。 这个答案应该是一个评论,因为你没有回答这个问题。 RPC 的整个想法是让它看起来像一个本地调用。以上是关于CORBA:CORBA IDL 类型可以是另一个属性吗?的主要内容,如果未能解决你的问题,请参考以下文章