在开始使用CORBA之前,我想了解一些事情。
对我来说,你可以使用IDL类型作为另一个属性,然后将该属性的方法暴露给客户端应用程序(使用“。”),这似乎很直观。
但这可能吗?
例如(原谅我的坏IDL):
interface Car{
attribute BrakePedal brakePedal;
//...
}
//then.. (place above)
interface BrakePedal{
void press();
//...
}
//...
然后在客户端应用中,您可以执行:myCar.brakePedal.press();
答案 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()语法会让人很难看到在那一行上执行了两个不同的远程调用,并且很难处理可能发生的任何故障。