2010-08-23 59 views
1

在我開始使用CORBA之前,我想知道一些事情。CORBA:CORBA IDL類型可以是另一個屬性嗎?

對我而言,您可以使用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接口。

+0

我認爲你只是不瞭解屬性。屬性是功能的簡稱。在這種情況下,您正在調用「讀取」功能。第二級調用發生在客戶端。服務器完全沒有意識到,當你進行屬性「讀取」調用時你會這樣做,所以它不能被「優化」。它不知道你要用這​​個對象引用做什麼。不,我不認爲我們會看到一個新的主要版本的CORBA。它現在僅被用於少數幾個專門的小衆應用程序和遺留應用程序。 – 2010-08-26 17:00:42

0

您不瞭解分佈式對象的一些重要內容:遠程對象(不管是用CORBA,RMI,.NET遠程處理還是Web服務實現)與本地對象都不相同。調用CORBA對象代價昂貴,速度慢,並且可能由於網絡問題而失敗。 object.attribute.method()語法使得很難看到兩行不同的遠程調用正在該行上執行,並且使得難以處理可能發生的任何故障。

+0

哦,非常有趣,謝謝!除此之外,我打算純粹在本地系統上使用它(爲了讓新的硬件設備與想要在同一臺臺式計算機上支持它的第三方應用程序進行交互,而不考慮平臺/語言)。它仍然是一個確定的?(請原諒我在閱讀你的文章時的愚蠢行爲,但我不確定你是否說這在網絡中是不可取的,或者實際上在IDL中是不可行的)。 – Navigateur 2010-08-25 19:53:45

+0

這個答案應該是一個評論,因爲你沒有回答這個問題。 RPC的整個想法是讓它看起來像本地電話。 – 2010-08-26 13:44:11

相關問題